PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/*
* Generic OPP Interface
*
* Copyright ( C ) 2009 - 2010 Texas Instruments Incorporated .
* Nishanth Menon
* Romit Dasgupta
* Kevin Hilman
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
2015-10-17 07:15:18 +03:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2016-02-09 08:00:38 +03:00
# include <linux/clk.h>
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
# include <linux/errno.h>
# include <linux/err.h>
# include <linux/slab.h>
2012-01-22 20:23:42 +04:00
# include <linux/device.h>
2012-10-23 03:27:44 +04:00
# include <linux/export.h>
2016-02-09 08:00:33 +03:00
# include <linux/regulator/consumer.h>
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2015-09-04 11:17:26 +03:00
# include "opp.h"
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/*
2016-02-16 11:47:53 +03:00
* The root of the list of all opp - tables . All opp_table structures branch off
* from here , with each opp_table containing the list of opps it supports in
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* various states of availability .
*/
2016-05-05 13:50:33 +03:00
LIST_HEAD ( opp_tables ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/* Lock to allow exclusive modification to the device and opp lists */
2016-02-16 11:47:53 +03:00
DEFINE_MUTEX ( opp_table_lock ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2014-12-17 02:09:36 +03:00
# define opp_rcu_lockdep_assert() \
do { \
2015-06-19 01:50:02 +03:00
RCU_LOCKDEP_WARN ( ! rcu_read_lock_held ( ) & & \
2016-02-16 11:47:53 +03:00
! lockdep_is_held ( & opp_table_lock ) , \
" Missing rcu_read_lock() or " \
" opp_table_lock protection " ) ; \
2014-12-17 02:09:36 +03:00
} while ( 0 )
2016-02-16 11:47:53 +03:00
static struct opp_device * _find_opp_dev ( const struct device * dev ,
struct opp_table * opp_table )
2015-07-29 13:53:04 +03:00
{
2016-02-16 11:47:53 +03:00
struct opp_device * opp_dev ;
2015-07-29 13:53:04 +03:00
2016-02-16 11:47:53 +03:00
list_for_each_entry ( opp_dev , & opp_table - > dev_list , node )
if ( opp_dev - > dev = = dev )
return opp_dev ;
2015-07-29 13:53:04 +03:00
return NULL ;
}
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/**
2016-02-16 11:47:53 +03:00
* _find_opp_table ( ) - find opp_table struct using device pointer
* @ dev : device pointer used to lookup OPP table
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*
2016-02-16 11:47:53 +03:00
* Search OPP table for one containing matching device . Does a RCU reader
* operation to grab the pointer needed .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*
2016-02-16 11:47:53 +03:00
* Return : pointer to ' struct opp_table ' if found , otherwise - ENODEV or
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* - EINVAL based on type of error .
*
2015-11-05 11:51:21 +03:00
* Locking : For readers , this function must be called under rcu_read_lock ( ) .
2016-02-16 11:47:53 +03:00
* opp_table is a RCU protected pointer , which means that opp_table is valid
2015-11-05 11:51:21 +03:00
* as long as we are under RCU lock .
*
2016-02-16 11:47:53 +03:00
* For Writers , this function must be called with opp_table_lock held .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*/
2016-02-16 11:47:53 +03:00
struct opp_table * _find_opp_table ( struct device * dev )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2015-11-05 11:51:21 +03:00
opp_rcu_lockdep_assert ( ) ;
2015-08-12 13:29:39 +03:00
if ( IS_ERR_OR_NULL ( dev ) ) {
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
pr_err ( " %s: Invalid parameters \n " , __func__ ) ;
return ERR_PTR ( - EINVAL ) ;
}
2016-02-16 11:47:53 +03:00
list_for_each_entry_rcu ( opp_table , & opp_tables , node )
if ( _find_opp_dev ( dev , opp_table ) )
return opp_table ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2015-07-29 13:53:04 +03:00
return ERR_PTR ( - ENODEV ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
}
/**
2015-09-10 20:09:29 +03:00
* dev_pm_opp_get_voltage ( ) - Gets the voltage corresponding to an opp
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* @ opp : opp for which voltage has to be returned for
*
2014-12-24 20:22:57 +03:00
* Return : voltage in micro volt corresponding to the opp , else
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* return 0
*
2016-12-01 13:58:19 +03:00
* This is useful only for devices with single power supply .
*
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* Locking : This function must be called under rcu_read_lock ( ) . opp is a rcu
* protected pointer . This means that opp which could have been fetched by
* opp_find_freq_ { exact , ceil , floor } functions is valid as long as we are
* under RCU lock . The pointer returned by the opp_find_freq family must be
* used in the same section as the usage of this function with the pointer
* prior to unlocking with rcu_read_unlock ( ) to maintain the integrity of the
* pointer .
*/
2013-09-20 01:03:51 +04:00
unsigned long dev_pm_opp_get_voltage ( struct dev_pm_opp * opp )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2013-09-20 01:03:51 +04:00
struct dev_pm_opp * tmp_opp ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
unsigned long v = 0 ;
2015-01-09 11:27:57 +03:00
opp_rcu_lockdep_assert ( ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
tmp_opp = rcu_dereference ( opp ) ;
2015-09-10 20:09:29 +03:00
if ( IS_ERR_OR_NULL ( tmp_opp ) )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
pr_err ( " %s: Invalid parameters \n " , __func__ ) ;
else
2016-12-01 13:58:19 +03:00
v = tmp_opp - > supplies [ 0 ] . u_volt ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
return v ;
}
2013-09-20 01:03:50 +04:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_get_voltage ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/**
2013-09-20 01:03:50 +04:00
* dev_pm_opp_get_freq ( ) - Gets the frequency corresponding to an available opp
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* @ opp : opp for which frequency has to be returned for
*
2014-12-24 20:22:57 +03:00
* Return : frequency in hertz corresponding to the opp , else
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* return 0
*
* Locking : This function must be called under rcu_read_lock ( ) . opp is a rcu
* protected pointer . This means that opp which could have been fetched by
* opp_find_freq_ { exact , ceil , floor } functions is valid as long as we are
* under RCU lock . The pointer returned by the opp_find_freq family must be
* used in the same section as the usage of this function with the pointer
* prior to unlocking with rcu_read_unlock ( ) to maintain the integrity of the
* pointer .
*/
2013-09-20 01:03:51 +04:00
unsigned long dev_pm_opp_get_freq ( struct dev_pm_opp * opp )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2013-09-20 01:03:51 +04:00
struct dev_pm_opp * tmp_opp ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
unsigned long f = 0 ;
2015-01-09 11:27:57 +03:00
opp_rcu_lockdep_assert ( ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
tmp_opp = rcu_dereference ( opp ) ;
2015-08-12 13:29:39 +03:00
if ( IS_ERR_OR_NULL ( tmp_opp ) | | ! tmp_opp - > available )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
pr_err ( " %s: Invalid parameters \n " , __func__ ) ;
else
f = tmp_opp - > rate ;
return f ;
}
2013-09-20 01:03:50 +04:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_get_freq ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2015-07-09 18:43:35 +03:00
/**
* dev_pm_opp_is_turbo ( ) - Returns if opp is turbo OPP or not
* @ opp : opp for which turbo mode is being verified
*
* Turbo OPPs are not for normal use , and can be enabled ( under certain
* conditions ) for short duration of times to finish high throughput work
* quickly . Running on them for longer times may overheat the chip .
*
* Return : true if opp is turbo opp , else false .
*
* Locking : This function must be called under rcu_read_lock ( ) . opp is a rcu
* protected pointer . This means that opp which could have been fetched by
* opp_find_freq_ { exact , ceil , floor } functions is valid as long as we are
* under RCU lock . The pointer returned by the opp_find_freq family must be
* used in the same section as the usage of this function with the pointer
* prior to unlocking with rcu_read_unlock ( ) to maintain the integrity of the
* pointer .
*/
bool dev_pm_opp_is_turbo ( struct dev_pm_opp * opp )
{
struct dev_pm_opp * tmp_opp ;
opp_rcu_lockdep_assert ( ) ;
tmp_opp = rcu_dereference ( opp ) ;
if ( IS_ERR_OR_NULL ( tmp_opp ) | | ! tmp_opp - > available ) {
pr_err ( " %s: Invalid parameters \n " , __func__ ) ;
return false ;
}
return tmp_opp - > turbo ;
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_is_turbo ) ;
2015-07-29 13:53:03 +03:00
/**
* dev_pm_opp_get_max_clock_latency ( ) - Get max clock latency in nanoseconds
* @ dev : device for which we do this operation
*
* Return : This function returns the max clock latency in nanoseconds .
*
* Locking : This function takes rcu_read_lock ( ) .
*/
unsigned long dev_pm_opp_get_max_clock_latency ( struct device * dev )
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2015-07-29 13:53:03 +03:00
unsigned long clock_latency_ns ;
rcu_read_lock ( ) ;
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) )
2015-07-29 13:53:03 +03:00
clock_latency_ns = 0 ;
else
2016-02-16 11:47:53 +03:00
clock_latency_ns = opp_table - > clock_latency_ns_max ;
2015-07-29 13:53:03 +03:00
rcu_read_unlock ( ) ;
return clock_latency_ns ;
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_get_max_clock_latency ) ;
2016-12-01 13:58:19 +03:00
static int _get_regulator_count ( struct device * dev )
{
struct opp_table * opp_table ;
int count ;
rcu_read_lock ( ) ;
opp_table = _find_opp_table ( dev ) ;
if ( ! IS_ERR ( opp_table ) )
count = opp_table - > regulator_count ;
else
count = 0 ;
rcu_read_unlock ( ) ;
return count ;
}
2016-02-09 08:00:35 +03:00
/**
* dev_pm_opp_get_max_volt_latency ( ) - Get max voltage latency in nanoseconds
* @ dev : device for which we do this operation
*
* Return : This function returns the max voltage latency in nanoseconds .
*
* Locking : This function takes rcu_read_lock ( ) .
*/
unsigned long dev_pm_opp_get_max_volt_latency ( struct device * dev )
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2016-02-09 08:00:35 +03:00
struct dev_pm_opp * opp ;
2016-12-01 13:58:19 +03:00
struct regulator * reg , * * regulators ;
2016-02-09 08:00:35 +03:00
unsigned long latency_ns = 0 ;
2016-12-01 13:58:19 +03:00
int ret , i , count ;
struct {
unsigned long min ;
unsigned long max ;
} * uV ;
count = _get_regulator_count ( dev ) ;
/* Regulator may not be required for the device */
if ( ! count )
return 0 ;
regulators = kmalloc_array ( count , sizeof ( * regulators ) , GFP_KERNEL ) ;
if ( ! regulators )
return 0 ;
uV = kmalloc_array ( count , sizeof ( * uV ) , GFP_KERNEL ) ;
if ( ! uV )
goto free_regulators ;
2016-02-09 08:00:35 +03:00
rcu_read_lock ( ) ;
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) ) {
2016-02-09 08:00:35 +03:00
rcu_read_unlock ( ) ;
2016-12-01 13:58:19 +03:00
goto free_uV ;
2016-02-09 08:00:35 +03:00
}
2016-12-01 13:58:19 +03:00
memcpy ( regulators , opp_table - > regulators , count * sizeof ( * regulators ) ) ;
2016-02-09 08:00:35 +03:00
2016-12-01 13:58:19 +03:00
for ( i = 0 ; i < count ; i + + ) {
uV [ i ] . min = ~ 0 ;
uV [ i ] . max = 0 ;
2016-02-09 08:00:35 +03:00
2016-12-01 13:58:19 +03:00
list_for_each_entry_rcu ( opp , & opp_table - > opp_list , node ) {
if ( ! opp - > available )
continue ;
if ( opp - > supplies [ i ] . u_volt_min < uV [ i ] . min )
uV [ i ] . min = opp - > supplies [ i ] . u_volt_min ;
if ( opp - > supplies [ i ] . u_volt_max > uV [ i ] . max )
uV [ i ] . max = opp - > supplies [ i ] . u_volt_max ;
}
2016-02-09 08:00:35 +03:00
}
rcu_read_unlock ( ) ;
/*
2016-02-16 11:47:53 +03:00
* The caller needs to ensure that opp_table ( and hence the regulator )
2016-02-09 08:00:35 +03:00
* isn ' t freed , while we are executing this routine .
*/
2016-12-01 13:58:19 +03:00
for ( i = 0 ; reg = regulators [ i ] , i < count ; i + + ) {
ret = regulator_set_voltage_time ( reg , uV [ i ] . min , uV [ i ] . max ) ;
if ( ret > 0 )
latency_ns + = ret * 1000 ;
}
free_uV :
kfree ( uV ) ;
free_regulators :
kfree ( regulators ) ;
2016-02-09 08:00:35 +03:00
return latency_ns ;
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_get_max_volt_latency ) ;
2016-02-09 08:00:36 +03:00
/**
* dev_pm_opp_get_max_transition_latency ( ) - Get max transition latency in
* nanoseconds
* @ dev : device for which we do this operation
*
* Return : This function returns the max transition latency , in nanoseconds , to
* switch from one OPP to other .
*
* Locking : This function takes rcu_read_lock ( ) .
*/
unsigned long dev_pm_opp_get_max_transition_latency ( struct device * dev )
{
return dev_pm_opp_get_max_volt_latency ( dev ) +
dev_pm_opp_get_max_clock_latency ( dev ) ;
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_get_max_transition_latency ) ;
2015-09-08 19:41:01 +03:00
/**
2017-01-02 12:11:02 +03:00
* dev_pm_opp_get_suspend_opp_freq ( ) - Get frequency of suspend opp in Hz
2015-09-08 19:41:01 +03:00
* @ dev : device for which we do this operation
*
2017-01-02 12:11:02 +03:00
* Return : This function returns the frequency of the OPP marked as suspend_opp
* if one is available , else returns 0 ;
2015-09-08 19:41:01 +03:00
*/
2017-01-02 12:11:02 +03:00
unsigned long dev_pm_opp_get_suspend_opp_freq ( struct device * dev )
2015-09-08 19:41:01 +03:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2017-01-02 12:11:02 +03:00
unsigned long freq = 0 ;
2015-09-08 19:41:01 +03:00
2017-01-02 12:11:02 +03:00
rcu_read_lock ( ) ;
2015-09-08 19:41:01 +03:00
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) | | ! opp_table - > suspend_opp | |
! opp_table - > suspend_opp - > available )
2017-01-02 12:11:02 +03:00
goto unlock ;
freq = dev_pm_opp_get_freq ( opp_table - > suspend_opp ) ;
2015-09-08 19:41:01 +03:00
2017-01-02 12:11:02 +03:00
unlock :
rcu_read_unlock ( ) ;
return freq ;
2015-09-08 19:41:01 +03:00
}
2017-01-02 12:11:02 +03:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_get_suspend_opp_freq ) ;
2015-09-08 19:41:01 +03:00
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/**
2016-02-16 11:47:53 +03:00
* dev_pm_opp_get_opp_count ( ) - Get number of opps available in the opp table
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* @ dev : device for which we do this operation
*
2014-12-24 20:22:57 +03:00
* Return : This function returns the number of available opps if there are any ,
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* else returns 0 if none or the corresponding error value .
*
2014-12-17 02:09:38 +03:00
* Locking : This function takes rcu_read_lock ( ) .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*/
2013-09-20 01:03:50 +04:00
int dev_pm_opp_get_opp_count ( struct device * dev )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2013-09-20 01:03:51 +04:00
struct dev_pm_opp * temp_opp ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
int count = 0 ;
2014-12-17 02:09:38 +03:00
rcu_read_lock ( ) ;
2014-12-17 02:09:36 +03:00
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) ) {
count = PTR_ERR ( opp_table ) ;
dev_err ( dev , " %s: OPP table not found (%d) \n " ,
2014-12-17 02:09:38 +03:00
__func__ , count ) ;
goto out_unlock ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
}
2016-02-16 11:47:53 +03:00
list_for_each_entry_rcu ( temp_opp , & opp_table - > opp_list , node ) {
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
if ( temp_opp - > available )
count + + ;
}
2014-12-17 02:09:38 +03:00
out_unlock :
rcu_read_unlock ( ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
return count ;
}
2013-09-20 01:03:50 +04:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_get_opp_count ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/**
2013-09-20 01:03:50 +04:00
* dev_pm_opp_find_freq_exact ( ) - search for an exact frequency
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* @ dev : device for which we do this operation
* @ freq : frequency to search for
2011-02-26 01:46:18 +03:00
* @ available : true / false - match for available opp
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*
2016-02-16 11:47:53 +03:00
* Return : Searches for exact match in the opp table and returns pointer to the
2014-12-24 20:22:57 +03:00
* matching opp if found , else returns ERR_PTR in case of error and should
* be handled using IS_ERR . Error return values can be :
2012-10-25 00:00:12 +04:00
* EINVAL : for bad pointer
* ERANGE : no match found for search
* ENODEV : if device not found in list of registered devices
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*
* Note : available is a modifier for the search . if available = true , then the
* match is for exact matching frequency and is available in the stored OPP
* table . if false , the match is for exact frequency which is not available .
*
* This provides a mechanism to enable an opp which is not available currently
* or the opposite as well .
*
* Locking : This function must be called under rcu_read_lock ( ) . opp is a rcu
* protected pointer . The reason for the same is that the opp pointer which is
* returned will remain valid for use with opp_get_ { voltage , freq } only while
* under the locked area . The pointer returned must be used prior to unlocking
* with rcu_read_unlock ( ) to maintain the integrity of the pointer .
*/
2013-09-20 01:03:51 +04:00
struct dev_pm_opp * dev_pm_opp_find_freq_exact ( struct device * dev ,
unsigned long freq ,
bool available )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2013-09-20 01:03:51 +04:00
struct dev_pm_opp * temp_opp , * opp = ERR_PTR ( - ERANGE ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2014-12-17 02:09:36 +03:00
opp_rcu_lockdep_assert ( ) ;
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) ) {
int r = PTR_ERR ( opp_table ) ;
dev_err ( dev , " %s: OPP table not found (%d) \n " , __func__ , r ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
return ERR_PTR ( r ) ;
}
2016-02-16 11:47:53 +03:00
list_for_each_entry_rcu ( temp_opp , & opp_table - > opp_list , node ) {
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
if ( temp_opp - > available = = available & &
temp_opp - > rate = = freq ) {
opp = temp_opp ;
break ;
}
}
return opp ;
}
2013-09-20 01:03:50 +04:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_find_freq_exact ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2016-07-25 09:11:16 +03:00
static noinline struct dev_pm_opp * _find_freq_ceil ( struct opp_table * opp_table ,
unsigned long * freq )
{
struct dev_pm_opp * temp_opp , * opp = ERR_PTR ( - ERANGE ) ;
list_for_each_entry_rcu ( temp_opp , & opp_table - > opp_list , node ) {
if ( temp_opp - > available & & temp_opp - > rate > = * freq ) {
opp = temp_opp ;
* freq = opp - > rate ;
break ;
}
}
return opp ;
}
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/**
2013-09-20 01:03:50 +04:00
* dev_pm_opp_find_freq_ceil ( ) - Search for an rounded ceil freq
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* @ dev : device for which we do this operation
* @ freq : Start frequency
*
* Search for the matching ceil * available * OPP from a starting freq
* for a device .
*
2014-12-24 20:22:57 +03:00
* Return : matching * opp and refreshes * freq accordingly , else returns
2012-10-25 00:00:12 +04:00
* ERR_PTR in case of error and should be handled using IS_ERR . Error return
* values can be :
* EINVAL : for bad pointer
* ERANGE : no match found for search
* ENODEV : if device not found in list of registered devices
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*
* Locking : This function must be called under rcu_read_lock ( ) . opp is a rcu
* protected pointer . The reason for the same is that the opp pointer which is
* returned will remain valid for use with opp_get_ { voltage , freq } only while
* under the locked area . The pointer returned must be used prior to unlocking
* with rcu_read_unlock ( ) to maintain the integrity of the pointer .
*/
2013-09-20 01:03:51 +04:00
struct dev_pm_opp * dev_pm_opp_find_freq_ceil ( struct device * dev ,
unsigned long * freq )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2014-12-17 02:09:36 +03:00
opp_rcu_lockdep_assert ( ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
if ( ! dev | | ! freq ) {
dev_err ( dev , " %s: Invalid argument freq=%p \n " , __func__ , freq ) ;
return ERR_PTR ( - EINVAL ) ;
}
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) )
return ERR_CAST ( opp_table ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2016-07-25 09:11:16 +03:00
return _find_freq_ceil ( opp_table , freq ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
}
2013-09-20 01:03:50 +04:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_find_freq_ceil ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/**
2013-09-20 01:03:50 +04:00
* dev_pm_opp_find_freq_floor ( ) - Search for a rounded floor freq
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* @ dev : device for which we do this operation
* @ freq : Start frequency
*
* Search for the matching floor * available * OPP from a starting freq
* for a device .
*
2014-12-24 20:22:57 +03:00
* Return : matching * opp and refreshes * freq accordingly , else returns
2012-10-25 00:00:12 +04:00
* ERR_PTR in case of error and should be handled using IS_ERR . Error return
* values can be :
* EINVAL : for bad pointer
* ERANGE : no match found for search
* ENODEV : if device not found in list of registered devices
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*
* Locking : This function must be called under rcu_read_lock ( ) . opp is a rcu
* protected pointer . The reason for the same is that the opp pointer which is
* returned will remain valid for use with opp_get_ { voltage , freq } only while
* under the locked area . The pointer returned must be used prior to unlocking
* with rcu_read_unlock ( ) to maintain the integrity of the pointer .
*/
2013-09-20 01:03:51 +04:00
struct dev_pm_opp * dev_pm_opp_find_freq_floor ( struct device * dev ,
unsigned long * freq )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2013-09-20 01:03:51 +04:00
struct dev_pm_opp * temp_opp , * opp = ERR_PTR ( - ERANGE ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2014-12-17 02:09:36 +03:00
opp_rcu_lockdep_assert ( ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
if ( ! dev | | ! freq ) {
dev_err ( dev , " %s: Invalid argument freq=%p \n " , __func__ , freq ) ;
return ERR_PTR ( - EINVAL ) ;
}
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) )
return ERR_CAST ( opp_table ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2016-02-16 11:47:53 +03:00
list_for_each_entry_rcu ( temp_opp , & opp_table - > opp_list , node ) {
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
if ( temp_opp - > available ) {
/* go to the next node, before choosing prev */
if ( temp_opp - > rate > * freq )
break ;
else
opp = temp_opp ;
}
}
if ( ! IS_ERR ( opp ) )
* freq = opp - > rate ;
return opp ;
}
2013-09-20 01:03:50 +04:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_find_freq_floor ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2016-02-09 08:00:39 +03:00
/*
2016-02-16 11:47:53 +03:00
* The caller needs to ensure that opp_table ( and hence the clk ) isn ' t freed ,
2016-02-09 08:00:39 +03:00
* while clk returned here is used .
*/
static struct clk * _get_opp_clk ( struct device * dev )
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2016-02-09 08:00:39 +03:00
struct clk * clk ;
rcu_read_lock ( ) ;
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) ) {
2016-02-09 08:00:39 +03:00
dev_err ( dev , " %s: device opp doesn't exist \n " , __func__ ) ;
2016-02-16 11:47:53 +03:00
clk = ERR_CAST ( opp_table ) ;
2016-02-09 08:00:39 +03:00
goto unlock ;
}
2016-02-16 11:47:53 +03:00
clk = opp_table - > clk ;
2016-02-09 08:00:39 +03:00
if ( IS_ERR ( clk ) )
dev_err ( dev , " %s: No clock available for the device \n " ,
__func__ ) ;
unlock :
rcu_read_unlock ( ) ;
return clk ;
}
static int _set_opp_voltage ( struct device * dev , struct regulator * reg ,
2016-12-01 13:58:18 +03:00
struct dev_pm_opp_supply * supply )
2016-02-09 08:00:39 +03:00
{
int ret ;
/* Regulator not available for device */
if ( IS_ERR ( reg ) ) {
dev_dbg ( dev , " %s: regulator not available: %ld \n " , __func__ ,
PTR_ERR ( reg ) ) ;
return 0 ;
}
2016-12-01 13:58:18 +03:00
dev_dbg ( dev , " %s: voltages (mV): %lu %lu %lu \n " , __func__ ,
supply - > u_volt_min , supply - > u_volt , supply - > u_volt_max ) ;
2016-02-09 08:00:39 +03:00
2016-12-01 13:58:18 +03:00
ret = regulator_set_voltage_triplet ( reg , supply - > u_volt_min ,
supply - > u_volt , supply - > u_volt_max ) ;
2016-02-09 08:00:39 +03:00
if ( ret )
dev_err ( dev , " %s: failed to set voltage (%lu %lu %lu mV): %d \n " ,
2016-12-01 13:58:18 +03:00
__func__ , supply - > u_volt_min , supply - > u_volt ,
supply - > u_volt_max , ret ) ;
2016-02-09 08:00:39 +03:00
return ret ;
}
2016-12-01 13:58:20 +03:00
static inline int
_generic_set_opp_clk_only ( struct device * dev , struct clk * clk ,
unsigned long old_freq , unsigned long freq )
{
int ret ;
ret = clk_set_rate ( clk , freq ) ;
if ( ret ) {
dev_err ( dev , " %s: failed to set clock rate: %d \n " , __func__ ,
ret ) ;
}
return ret ;
}
static int _generic_set_opp ( struct dev_pm_set_opp_data * data )
{
struct dev_pm_opp_supply * old_supply = data - > old_opp . supplies ;
struct dev_pm_opp_supply * new_supply = data - > new_opp . supplies ;
unsigned long old_freq = data - > old_opp . rate , freq = data - > new_opp . rate ;
struct regulator * reg = data - > regulators [ 0 ] ;
struct device * dev = data - > dev ;
int ret ;
/* This function only supports single regulator per device */
if ( WARN_ON ( data - > regulator_count > 1 ) ) {
dev_err ( dev , " multiple regulators are not supported \n " ) ;
return - EINVAL ;
}
/* Scaling up? Scale voltage before frequency */
if ( freq > old_freq ) {
ret = _set_opp_voltage ( dev , reg , new_supply ) ;
if ( ret )
goto restore_voltage ;
}
/* Change frequency */
ret = _generic_set_opp_clk_only ( dev , data - > clk , old_freq , freq ) ;
if ( ret )
goto restore_voltage ;
/* Scaling down? Scale voltage after frequency */
if ( freq < old_freq ) {
ret = _set_opp_voltage ( dev , reg , new_supply ) ;
if ( ret )
goto restore_freq ;
}
return 0 ;
restore_freq :
if ( _generic_set_opp_clk_only ( dev , data - > clk , freq , old_freq ) )
dev_err ( dev , " %s: failed to restore old-freq (%lu Hz) \n " ,
__func__ , old_freq ) ;
restore_voltage :
/* This shouldn't harm even if the voltages weren't updated earlier */
if ( old_supply - > u_volt )
_set_opp_voltage ( dev , reg , old_supply ) ;
return ret ;
}
2016-02-09 08:00:39 +03:00
/**
* dev_pm_opp_set_rate ( ) - Configure new OPP based on frequency
* @ dev : device for which we do this operation
* @ target_freq : frequency to achieve
*
* This configures the power - supplies and clock source to the levels specified
* by the OPP corresponding to the target_freq .
*
* Locking : This function takes rcu_read_lock ( ) .
*/
int dev_pm_opp_set_rate ( struct device * dev , unsigned long target_freq )
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2016-12-01 13:58:20 +03:00
unsigned long freq , old_freq ;
2016-12-01 13:58:21 +03:00
int ( * set_opp ) ( struct dev_pm_set_opp_data * data ) ;
2016-02-09 08:00:39 +03:00
struct dev_pm_opp * old_opp , * opp ;
2016-12-01 13:58:20 +03:00
struct regulator * * regulators ;
struct dev_pm_set_opp_data * data ;
2016-02-09 08:00:39 +03:00
struct clk * clk ;
2016-12-01 13:58:20 +03:00
int ret , size ;
2016-02-09 08:00:39 +03:00
if ( unlikely ( ! target_freq ) ) {
dev_err ( dev , " %s: Invalid target frequency %lu \n " , __func__ ,
target_freq ) ;
return - EINVAL ;
}
clk = _get_opp_clk ( dev ) ;
if ( IS_ERR ( clk ) )
return PTR_ERR ( clk ) ;
freq = clk_round_rate ( clk , target_freq ) ;
if ( ( long ) freq < = 0 )
freq = target_freq ;
old_freq = clk_get_rate ( clk ) ;
/* Return early if nothing to do */
if ( old_freq = = freq ) {
dev_dbg ( dev , " %s: old/new frequencies (%lu Hz) are same, nothing to do \n " ,
__func__ , freq ) ;
return 0 ;
}
rcu_read_lock ( ) ;
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) ) {
2016-02-09 08:00:39 +03:00
dev_err ( dev , " %s: device opp doesn't exist \n " , __func__ ) ;
rcu_read_unlock ( ) ;
2016-02-16 11:47:53 +03:00
return PTR_ERR ( opp_table ) ;
2016-02-09 08:00:39 +03:00
}
2016-07-25 09:11:16 +03:00
old_opp = _find_freq_ceil ( opp_table , & old_freq ) ;
2016-09-15 18:38:38 +03:00
if ( IS_ERR ( old_opp ) ) {
2016-02-09 08:00:39 +03:00
dev_err ( dev , " %s: failed to find current OPP for freq %lu (%ld) \n " ,
__func__ , old_freq , PTR_ERR ( old_opp ) ) ;
}
2016-07-25 09:11:16 +03:00
opp = _find_freq_ceil ( opp_table , & freq ) ;
2016-02-09 08:00:39 +03:00
if ( IS_ERR ( opp ) ) {
ret = PTR_ERR ( opp ) ;
dev_err ( dev , " %s: failed to find OPP for freq %lu (%d) \n " ,
__func__ , freq , ret ) ;
rcu_read_unlock ( ) ;
return ret ;
}
2016-12-01 13:58:20 +03:00
dev_dbg ( dev , " %s: switching OPP: %lu Hz --> %lu Hz \n " , __func__ ,
old_freq , freq ) ;
2016-12-01 13:58:19 +03:00
2016-12-01 13:58:20 +03:00
regulators = opp_table - > regulators ;
/* Only frequency scaling */
if ( ! regulators ) {
rcu_read_unlock ( ) ;
return _generic_set_opp_clk_only ( dev , clk , old_freq , freq ) ;
2016-12-01 13:58:19 +03:00
}
2016-12-01 13:58:21 +03:00
if ( opp_table - > set_opp )
set_opp = opp_table - > set_opp ;
else
set_opp = _generic_set_opp ;
2016-12-01 13:58:20 +03:00
data = opp_table - > set_opp_data ;
data - > regulators = regulators ;
data - > regulator_count = opp_table - > regulator_count ;
data - > clk = clk ;
data - > dev = dev ;
data - > old_opp . rate = old_freq ;
size = sizeof ( * opp - > supplies ) * opp_table - > regulator_count ;
2016-12-01 13:58:18 +03:00
if ( IS_ERR ( old_opp ) )
2016-12-01 13:58:20 +03:00
memset ( data - > old_opp . supplies , 0 , size ) ;
2016-12-01 13:58:18 +03:00
else
2016-12-01 13:58:20 +03:00
memcpy ( data - > old_opp . supplies , old_opp - > supplies , size ) ;
2016-02-09 08:00:39 +03:00
2016-12-01 13:58:20 +03:00
data - > new_opp . rate = freq ;
memcpy ( data - > new_opp . supplies , opp - > supplies , size ) ;
2016-02-09 08:00:39 +03:00
rcu_read_unlock ( ) ;
2016-12-01 13:58:21 +03:00
return set_opp ( data ) ;
2016-02-09 08:00:39 +03:00
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_set_rate ) ;
2016-02-16 11:47:53 +03:00
/* OPP-dev Helpers */
static void _kfree_opp_dev_rcu ( struct rcu_head * head )
2015-07-29 13:53:04 +03:00
{
2016-02-16 11:47:53 +03:00
struct opp_device * opp_dev ;
2015-07-29 13:53:04 +03:00
2016-02-16 11:47:53 +03:00
opp_dev = container_of ( head , struct opp_device , rcu_head ) ;
kfree_rcu ( opp_dev , rcu_head ) ;
2015-07-29 13:53:04 +03:00
}
2016-02-16 11:47:53 +03:00
static void _remove_opp_dev ( struct opp_device * opp_dev ,
struct opp_table * opp_table )
2015-07-29 13:53:04 +03:00
{
2016-02-16 11:47:53 +03:00
opp_debug_unregister ( opp_dev , opp_table ) ;
list_del ( & opp_dev - > node ) ;
call_srcu ( & opp_table - > srcu_head . srcu , & opp_dev - > rcu_head ,
_kfree_opp_dev_rcu ) ;
2015-07-29 13:53:04 +03:00
}
2016-02-16 11:47:53 +03:00
struct opp_device * _add_opp_dev ( const struct device * dev ,
struct opp_table * opp_table )
2015-07-29 13:53:04 +03:00
{
2016-02-16 11:47:53 +03:00
struct opp_device * opp_dev ;
2015-11-11 05:29:01 +03:00
int ret ;
2015-07-29 13:53:04 +03:00
2016-02-16 11:47:53 +03:00
opp_dev = kzalloc ( sizeof ( * opp_dev ) , GFP_KERNEL ) ;
if ( ! opp_dev )
2015-07-29 13:53:04 +03:00
return NULL ;
2016-02-16 11:47:53 +03:00
/* Initialize opp-dev */
opp_dev - > dev = dev ;
list_add_rcu ( & opp_dev - > node , & opp_table - > dev_list ) ;
2015-07-29 13:53:04 +03:00
2016-02-16 11:47:53 +03:00
/* Create debugfs entries for the opp_table */
ret = opp_debug_register ( opp_dev , opp_table ) ;
2015-11-11 05:29:01 +03:00
if ( ret )
dev_err ( dev , " %s: Failed to register opp debugfs (%d) \n " ,
__func__ , ret ) ;
2016-02-16 11:47:53 +03:00
return opp_dev ;
2015-07-29 13:53:04 +03:00
}
2017-01-02 12:11:04 +03:00
static struct opp_table * _allocate_opp_table ( struct device * dev )
2014-12-10 07:15:34 +03:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
struct opp_device * opp_dev ;
2016-02-09 08:00:38 +03:00
int ret ;
2014-12-10 07:15:34 +03:00
/*
2016-02-16 11:47:53 +03:00
* Allocate a new OPP table . In the infrequent case where a new
2014-12-10 07:15:34 +03:00
* device is needed to be added , we pay this penalty .
*/
2016-02-16 11:47:53 +03:00
opp_table = kzalloc ( sizeof ( * opp_table ) , GFP_KERNEL ) ;
if ( ! opp_table )
2014-12-10 07:15:34 +03:00
return NULL ;
2016-02-16 11:47:53 +03:00
INIT_LIST_HEAD ( & opp_table - > dev_list ) ;
2015-07-29 13:53:04 +03:00
2016-02-16 11:47:53 +03:00
opp_dev = _add_opp_dev ( dev , opp_table ) ;
if ( ! opp_dev ) {
kfree ( opp_table ) ;
2015-07-29 13:53:04 +03:00
return NULL ;
}
2016-05-05 13:50:33 +03:00
_of_init_opp_table ( opp_table , dev ) ;
2016-02-09 08:00:37 +03:00
2016-02-09 08:00:38 +03:00
/* Find clk for the device */
2016-02-16 11:47:53 +03:00
opp_table - > clk = clk_get ( dev , NULL ) ;
if ( IS_ERR ( opp_table - > clk ) ) {
ret = PTR_ERR ( opp_table - > clk ) ;
2016-02-09 08:00:38 +03:00
if ( ret ! = - EPROBE_DEFER )
dev_dbg ( dev , " %s: Couldn't find clock: %d \n " , __func__ ,
ret ) ;
}
2016-02-16 11:47:53 +03:00
srcu_init_notifier_head ( & opp_table - > srcu_head ) ;
INIT_LIST_HEAD ( & opp_table - > opp_list ) ;
2017-01-23 07:41:41 +03:00
mutex_init ( & opp_table - > lock ) ;
2017-01-23 07:41:42 +03:00
kref_init ( & opp_table - > kref ) ;
2014-12-10 07:15:34 +03:00
2016-02-16 11:47:53 +03:00
/* Secure the device table modification */
list_add_rcu ( & opp_table - > node , & opp_tables ) ;
return opp_table ;
2014-12-10 07:15:34 +03:00
}
2017-01-02 12:11:04 +03:00
/**
* _add_opp_table ( ) - Find OPP table or allocate a new one
* @ dev : device for which we do this operation
*
* It tries to find an existing table first , if it couldn ' t find one , it
* allocates a new OPP table and returns that .
*
* Return : valid opp_table pointer if success , else NULL .
*/
struct opp_table * _add_opp_table ( struct device * dev )
{
struct opp_table * opp_table ;
/* Check for existing table for 'dev' first */
opp_table = _find_opp_table ( dev ) ;
if ( ! IS_ERR ( opp_table ) )
return opp_table ;
return _allocate_opp_table ( dev ) ;
}
2014-12-24 20:22:57 +03:00
/**
2016-02-16 11:47:53 +03:00
* _kfree_device_rcu ( ) - Free opp_table RCU handler
2015-07-29 13:52:58 +03:00
* @ head : RCU head
2014-12-24 20:22:57 +03:00
*/
2015-07-29 13:52:58 +03:00
static void _kfree_device_rcu ( struct rcu_head * head )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table = container_of ( head , struct opp_table ,
rcu_head ) ;
2014-12-10 07:15:35 +03:00
2016-02-16 11:47:53 +03:00
kfree_rcu ( opp_table , rcu_head ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
}
2014-11-25 13:34:18 +03:00
2017-01-23 07:41:42 +03:00
void _get_opp_table_kref ( struct opp_table * opp_table )
2017-01-02 12:11:04 +03:00
{
2017-01-23 07:41:42 +03:00
kref_get ( & opp_table - > kref ) ;
}
struct opp_table * dev_pm_opp_get_opp_table ( struct device * dev )
{
struct opp_table * opp_table ;
/* Hold our table modification lock here */
mutex_lock ( & opp_table_lock ) ;
opp_table = _find_opp_table ( dev ) ;
if ( ! IS_ERR ( opp_table ) ) {
_get_opp_table_kref ( opp_table ) ;
goto unlock ;
}
opp_table = _allocate_opp_table ( dev ) ;
unlock :
mutex_unlock ( & opp_table_lock ) ;
return opp_table ;
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_get_opp_table ) ;
static void _opp_table_kref_release_unlocked ( struct kref * kref )
{
struct opp_table * opp_table = container_of ( kref , struct opp_table , kref ) ;
2017-01-02 12:11:04 +03:00
struct opp_device * opp_dev ;
/* Release clk */
if ( ! IS_ERR ( opp_table - > clk ) )
clk_put ( opp_table - > clk ) ;
opp_dev = list_first_entry ( & opp_table - > dev_list , struct opp_device ,
node ) ;
_remove_opp_dev ( opp_dev , opp_table ) ;
/* dev_list must be empty now */
WARN_ON ( ! list_empty ( & opp_table - > dev_list ) ) ;
2017-01-23 07:41:41 +03:00
mutex_destroy ( & opp_table - > lock ) ;
2017-01-02 12:11:04 +03:00
list_del_rcu ( & opp_table - > node ) ;
call_srcu ( & opp_table - > srcu_head . srcu , & opp_table - > rcu_head ,
_kfree_device_rcu ) ;
}
2017-01-23 07:41:42 +03:00
static void dev_pm_opp_put_opp_table_unlocked ( struct opp_table * opp_table )
{
kref_put ( & opp_table - > kref , _opp_table_kref_release_unlocked ) ;
}
static void _opp_table_kref_release ( struct kref * kref )
{
_opp_table_kref_release_unlocked ( kref ) ;
mutex_unlock ( & opp_table_lock ) ;
}
void dev_pm_opp_put_opp_table ( struct opp_table * opp_table )
{
kref_put_mutex ( & opp_table - > kref , _opp_table_kref_release ,
& opp_table_lock ) ;
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_put_opp_table ) ;
2014-11-25 13:34:18 +03:00
/**
2016-02-16 11:47:53 +03:00
* _remove_opp_table ( ) - Removes a OPP table
* @ opp_table : OPP table to be removed .
2014-11-25 13:34:18 +03:00
*
2016-02-16 11:47:53 +03:00
* Removes / frees OPP table if it doesn ' t contain any OPPs .
2014-11-25 13:34:18 +03:00
*/
2016-02-16 11:47:53 +03:00
static void _remove_opp_table ( struct opp_table * opp_table )
2014-11-25 13:34:18 +03:00
{
2017-01-23 07:41:42 +03:00
dev_pm_opp_put_opp_table_unlocked ( opp_table ) ;
2014-11-25 13:34:18 +03:00
}
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2017-01-02 12:11:01 +03:00
void _opp_free ( struct dev_pm_opp * opp )
2017-01-02 12:10:59 +03:00
{
kfree ( opp ) ;
}
2014-12-24 20:22:57 +03:00
/**
* _kfree_opp_rcu ( ) - Free OPP RCU handler
* @ head : RCU head
*/
2014-12-24 20:22:56 +03:00
static void _kfree_opp_rcu ( struct rcu_head * head )
2014-11-27 06:24:06 +03:00
{
struct dev_pm_opp * opp = container_of ( head , struct dev_pm_opp , rcu_head ) ;
kfree_rcu ( opp , rcu_head ) ;
}
2014-12-24 20:22:57 +03:00
/**
* _opp_remove ( ) - Remove an OPP from a table definition
2016-02-16 11:47:53 +03:00
* @ opp_table : points back to the opp_table struct this opp belongs to
2014-12-24 20:22:57 +03:00
* @ opp : pointer to the OPP to remove
*
2016-02-16 11:47:53 +03:00
* This function removes an opp definition from the opp table .
2014-12-24 20:22:57 +03:00
*
2016-02-16 11:47:53 +03:00
* Locking : The internal opp_table and opp structures are RCU protected .
2014-12-24 20:22:57 +03:00
* It is assumed that the caller holds required mutex for an RCU updater
* strategy .
*/
2017-01-02 12:10:59 +03:00
static void _opp_remove ( struct opp_table * opp_table , struct dev_pm_opp * opp )
2014-11-27 06:24:06 +03:00
{
2017-01-23 07:41:41 +03:00
mutex_lock ( & opp_table - > lock ) ;
2014-11-27 06:24:06 +03:00
/*
* Notify the changes in the availability of the operable
* frequency / voltage list .
*/
2017-01-02 12:10:59 +03:00
srcu_notifier_call_chain ( & opp_table - > srcu_head , OPP_EVENT_REMOVE , opp ) ;
2015-11-11 05:29:01 +03:00
opp_debug_remove_one ( opp ) ;
2014-11-27 06:24:06 +03:00
list_del_rcu ( & opp - > node ) ;
2016-02-16 11:47:53 +03:00
call_srcu ( & opp_table - > srcu_head . srcu , & opp - > rcu_head , _kfree_opp_rcu ) ;
2014-11-27 06:24:06 +03:00
2017-01-23 07:41:41 +03:00
mutex_unlock ( & opp_table - > lock ) ;
2017-01-23 07:41:44 +03:00
dev_pm_opp_put_opp_table ( opp_table ) ;
2014-11-27 06:24:06 +03:00
}
/**
2016-02-16 11:47:53 +03:00
* dev_pm_opp_remove ( ) - Remove an OPP from OPP table
2014-11-27 06:24:06 +03:00
* @ dev : device for which we do this operation
* @ freq : OPP to remove with matching ' freq '
*
2016-02-16 11:47:53 +03:00
* This function removes an opp from the opp table .
2014-12-24 20:22:57 +03:00
*
2016-02-16 11:47:53 +03:00
* Locking : The internal opp_table and opp structures are RCU protected .
2014-12-24 20:22:57 +03:00
* Hence this function internally uses RCU updater strategy with mutex locks
* to keep the integrity of the internal data structures . Callers should ensure
* that this function is * NOT * called under RCU protection or in contexts where
* mutex cannot be locked .
2014-11-27 06:24:06 +03:00
*/
void dev_pm_opp_remove ( struct device * dev , unsigned long freq )
{
struct dev_pm_opp * opp ;
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2014-11-27 06:24:06 +03:00
bool found = false ;
2016-02-16 11:47:53 +03:00
/* Hold our table modification lock here */
mutex_lock ( & opp_table_lock ) ;
2014-11-27 06:24:06 +03:00
2016-02-16 11:47:53 +03:00
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) )
2014-11-27 06:24:06 +03:00
goto unlock ;
2017-01-23 07:41:41 +03:00
mutex_lock ( & opp_table - > lock ) ;
2016-02-16 11:47:53 +03:00
list_for_each_entry ( opp , & opp_table - > opp_list , node ) {
2014-11-27 06:24:06 +03:00
if ( opp - > rate = = freq ) {
found = true ;
break ;
}
}
2017-01-23 07:41:41 +03:00
mutex_unlock ( & opp_table - > lock ) ;
2014-11-27 06:24:06 +03:00
if ( ! found ) {
dev_warn ( dev , " %s: Couldn't find OPP with freq: %lu \n " ,
__func__ , freq ) ;
goto unlock ;
}
2017-01-02 12:10:59 +03:00
_opp_remove ( opp_table , opp ) ;
2014-11-27 06:24:06 +03:00
unlock :
2016-02-16 11:47:53 +03:00
mutex_unlock ( & opp_table_lock ) ;
2014-11-27 06:24:06 +03:00
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_remove ) ;
2017-01-02 12:11:01 +03:00
struct dev_pm_opp * _opp_allocate ( struct opp_table * table )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2015-07-29 13:53:01 +03:00
struct dev_pm_opp * opp ;
2016-12-01 13:58:19 +03:00
int count , supply_size ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2016-12-01 13:58:19 +03:00
/* Allocate space for at least one supply */
count = table - > regulator_count ? table - > regulator_count : 1 ;
supply_size = sizeof ( * opp - > supplies ) * count ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2016-12-01 13:58:19 +03:00
/* allocate new OPP node and supplies structures */
opp = kzalloc ( sizeof ( * opp ) + supply_size , GFP_KERNEL ) ;
2017-01-02 12:11:01 +03:00
if ( ! opp )
2015-07-29 13:53:01 +03:00
return NULL ;
2016-12-01 13:58:19 +03:00
/* Put the supplies at the end of the OPP structure as an empty array */
opp - > supplies = ( struct dev_pm_opp_supply * ) ( opp + 1 ) ;
INIT_LIST_HEAD ( & opp - > node ) ;
2015-07-29 13:53:01 +03:00
return opp ;
}
2016-02-09 08:00:34 +03:00
static bool _opp_supported_by_regulators ( struct dev_pm_opp * opp ,
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table )
2016-02-09 08:00:34 +03:00
{
2016-12-01 13:58:19 +03:00
struct regulator * reg ;
int i ;
for ( i = 0 ; i < opp_table - > regulator_count ; i + + ) {
reg = opp_table - > regulators [ i ] ;
if ( ! regulator_is_supported_voltage ( reg ,
opp - > supplies [ i ] . u_volt_min ,
opp - > supplies [ i ] . u_volt_max ) ) {
pr_warn ( " %s: OPP minuV: %lu maxuV: %lu, not supported by regulator \n " ,
__func__ , opp - > supplies [ i ] . u_volt_min ,
opp - > supplies [ i ] . u_volt_max ) ;
return false ;
}
2016-02-09 08:00:34 +03:00
}
return true ;
}
2017-01-02 12:10:55 +03:00
/*
* Returns :
* 0 : On success . And appropriate error message for duplicate OPPs .
* - EBUSY : For OPP with same freq / volt and is available . The callers of
* _opp_add ( ) must return 0 if they receive - EBUSY from it . This is to make
* sure we don ' t print error messages unnecessarily if different parts of
* kernel try to initialize the OPP table .
* - EEXIST : For OPP with same freq but different volt or is unavailable . This
* should be considered an error by the callers of _opp_add ( ) .
*/
2016-05-05 13:50:33 +03:00
int _opp_add ( struct device * dev , struct dev_pm_opp * new_opp ,
struct opp_table * opp_table )
2015-07-29 13:53:01 +03:00
{
struct dev_pm_opp * opp ;
2017-01-23 07:41:41 +03:00
struct list_head * head ;
2015-11-11 05:29:01 +03:00
int ret ;
2015-07-29 13:53:01 +03:00
/*
* Insert new OPP in order of increasing frequency and discard if
* already present .
*
2016-02-16 11:47:53 +03:00
* Need to use & opp_table - > opp_list in the condition part of the ' for '
2015-07-29 13:53:01 +03:00
* loop , don ' t replace it with head otherwise it will become an infinite
* loop .
*/
2017-01-23 07:41:41 +03:00
mutex_lock ( & opp_table - > lock ) ;
head = & opp_table - > opp_list ;
2016-02-16 11:47:53 +03:00
list_for_each_entry_rcu ( opp , & opp_table - > opp_list , node ) {
2015-07-29 13:53:01 +03:00
if ( new_opp - > rate > opp - > rate ) {
head = & opp - > node ;
continue ;
}
if ( new_opp - > rate < opp - > rate )
break ;
/* Duplicate OPPs */
2015-07-29 13:53:04 +03:00
dev_warn ( dev , " %s: duplicate OPPs detected. Existing: freq: %lu, volt: %lu, enabled: %d. New: freq: %lu, volt: %lu, enabled: %d \n " ,
2016-12-01 13:58:19 +03:00
__func__ , opp - > rate , opp - > supplies [ 0 ] . u_volt ,
opp - > available , new_opp - > rate ,
new_opp - > supplies [ 0 ] . u_volt , new_opp - > available ) ;
2015-07-29 13:53:01 +03:00
2016-12-01 13:58:19 +03:00
/* Should we compare voltages for all regulators here ? */
2017-01-23 07:41:41 +03:00
ret = opp - > available & &
new_opp - > supplies [ 0 ] . u_volt = = opp - > supplies [ 0 ] . u_volt ? - EBUSY : - EEXIST ;
mutex_unlock ( & opp_table - > lock ) ;
return ret ;
2015-07-29 13:53:01 +03:00
}
list_add_rcu ( & new_opp - > node , head ) ;
2017-01-23 07:41:41 +03:00
mutex_unlock ( & opp_table - > lock ) ;
new_opp - > opp_table = opp_table ;
2015-07-29 13:53:01 +03:00
2017-01-23 07:41:44 +03:00
/* Get a reference to the OPP table */
_get_opp_table_kref ( opp_table ) ;
2016-02-16 11:47:53 +03:00
ret = opp_debug_create_one ( new_opp , opp_table ) ;
2015-11-11 05:29:01 +03:00
if ( ret )
dev_err ( dev , " %s: Failed to register opp to debugfs (%d) \n " ,
__func__ , ret ) ;
2016-02-16 11:47:53 +03:00
if ( ! _opp_supported_by_regulators ( new_opp , opp_table ) ) {
2016-02-09 08:00:34 +03:00
new_opp - > available = false ;
dev_warn ( dev , " %s: OPP not supported by regulators (%lu) \n " ,
__func__ , new_opp - > rate ) ;
}
2015-07-29 13:53:01 +03:00
return 0 ;
}
2014-12-24 20:22:57 +03:00
/**
2015-10-15 19:12:44 +03:00
* _opp_add_v1 ( ) - Allocate a OPP based on v1 bindings .
2017-01-02 12:11:01 +03:00
* @ opp_table : OPP table
2014-12-24 20:22:57 +03:00
* @ dev : device for which we do this operation
* @ freq : Frequency in Hz for this OPP
* @ u_volt : Voltage in uVolts for this OPP
* @ dynamic : Dynamically added OPPs .
*
2016-02-16 11:47:53 +03:00
* This function adds an opp definition to the opp table and returns status .
2014-12-24 20:22:57 +03:00
* The opp is made available by default and it can be controlled using
* dev_pm_opp_enable / disable functions and may be removed by dev_pm_opp_remove .
*
2015-09-04 11:17:24 +03:00
* NOTE : " dynamic " parameter impacts OPPs added by the dev_pm_opp_of_add_table
* and freed by dev_pm_opp_of_remove_table .
2014-12-24 20:22:57 +03:00
*
2016-02-16 11:47:53 +03:00
* Locking : The internal opp_table and opp structures are RCU protected .
2014-12-24 20:22:57 +03:00
* Hence this function internally uses RCU updater strategy with mutex locks
* to keep the integrity of the internal data structures . Callers should ensure
* that this function is * NOT * called under RCU protection or in contexts where
* mutex cannot be locked .
*
* Return :
* 0 On success OR
* Duplicate OPPs ( both freq and volt are same ) and opp - > available
* - EEXIST Freq are same and volt are different OR
* Duplicate OPPs ( both freq and volt are same ) and ! opp - > available
* - ENOMEM Memory allocation failure
*/
2017-01-02 12:11:01 +03:00
int _opp_add_v1 ( struct opp_table * opp_table , struct device * dev ,
unsigned long freq , long u_volt , bool dynamic )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2015-07-29 13:53:01 +03:00
struct dev_pm_opp * new_opp ;
2016-02-09 08:00:37 +03:00
unsigned long tol ;
2014-12-10 07:15:35 +03:00
int ret ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2017-01-02 12:11:01 +03:00
opp_rcu_lockdep_assert ( ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2017-01-02 12:11:01 +03:00
new_opp = _opp_allocate ( opp_table ) ;
if ( ! new_opp )
return - ENOMEM ;
2015-07-29 13:53:01 +03:00
2014-11-25 13:34:17 +03:00
/* populate the opp table */
new_opp - > rate = freq ;
2016-02-16 11:47:53 +03:00
tol = u_volt * opp_table - > voltage_tolerance_v1 / 100 ;
2016-12-01 13:58:19 +03:00
new_opp - > supplies [ 0 ] . u_volt = u_volt ;
new_opp - > supplies [ 0 ] . u_volt_min = u_volt - tol ;
new_opp - > supplies [ 0 ] . u_volt_max = u_volt + tol ;
2014-11-25 13:34:17 +03:00
new_opp - > available = true ;
2015-07-29 13:53:01 +03:00
new_opp - > dynamic = dynamic ;
2014-11-25 13:34:17 +03:00
2016-02-16 11:47:53 +03:00
ret = _opp_add ( dev , new_opp , opp_table ) ;
2017-01-02 12:10:55 +03:00
if ( ret ) {
/* Don't return error for duplicate OPPs */
if ( ret = = - EBUSY )
ret = 0 ;
2014-12-10 07:15:35 +03:00
goto free_opp ;
2017-01-02 12:10:55 +03:00
}
2014-05-22 09:06:26 +04:00
2011-10-01 00:35:12 +04:00
/*
* Notify the changes in the availability of the operable
* frequency / voltage list .
*/
2016-02-16 11:47:53 +03:00
srcu_notifier_call_chain ( & opp_table - > srcu_head , OPP_EVENT_ADD , new_opp ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
return 0 ;
2014-12-10 07:15:35 +03:00
free_opp :
2017-01-02 12:11:01 +03:00
_opp_free ( new_opp ) ;
2014-12-10 07:15:35 +03:00
return ret ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
}
2014-11-25 13:34:18 +03:00
2015-12-09 05:31:46 +03:00
/**
* dev_pm_opp_set_supported_hw ( ) - Set supported platforms
* @ dev : Device for which supported - hw has to be set .
* @ versions : Array of hierarchy of versions to match .
* @ count : Number of elements in the array .
*
* This is required only for the V2 bindings , and it enables a platform to
* specify the hierarchy of versions it supports . OPP layer will then enable
* OPPs , which are available for those versions , based on its ' opp - supported - hw '
* property .
*/
2017-01-23 07:41:43 +03:00
struct opp_table * dev_pm_opp_set_supported_hw ( struct device * dev ,
const u32 * versions , unsigned int count )
2015-12-09 05:31:46 +03:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2017-01-23 07:41:43 +03:00
int ret ;
2015-12-09 05:31:46 +03:00
2017-01-23 07:41:43 +03:00
opp_table = dev_pm_opp_get_opp_table ( dev ) ;
if ( ! opp_table )
return ERR_PTR ( - ENOMEM ) ;
2015-12-09 05:31:46 +03:00
2016-02-16 11:47:53 +03:00
/* Make sure there are no concurrent readers while updating opp_table */
WARN_ON ( ! list_empty ( & opp_table - > opp_list ) ) ;
2015-12-09 05:31:46 +03:00
2016-02-16 11:47:53 +03:00
/* Do we already have a version hierarchy associated with opp_table? */
if ( opp_table - > supported_hw ) {
2015-12-09 05:31:46 +03:00
dev_err ( dev , " %s: Already have supported hardware list \n " ,
__func__ ) ;
ret = - EBUSY ;
goto err ;
}
2016-02-16 11:47:53 +03:00
opp_table - > supported_hw = kmemdup ( versions , count * sizeof ( * versions ) ,
2015-12-09 05:31:46 +03:00
GFP_KERNEL ) ;
2016-02-16 11:47:53 +03:00
if ( ! opp_table - > supported_hw ) {
2015-12-09 05:31:46 +03:00
ret = - ENOMEM ;
goto err ;
}
2016-02-16 11:47:53 +03:00
opp_table - > supported_hw_count = count ;
2017-01-23 07:41:43 +03:00
return opp_table ;
2015-12-09 05:31:46 +03:00
err :
2017-01-23 07:41:43 +03:00
dev_pm_opp_put_opp_table ( opp_table ) ;
2015-12-09 05:31:46 +03:00
2017-01-23 07:41:43 +03:00
return ERR_PTR ( ret ) ;
2015-12-09 05:31:46 +03:00
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_set_supported_hw ) ;
/**
* dev_pm_opp_put_supported_hw ( ) - Releases resources blocked for supported hw
2017-01-23 07:41:43 +03:00
* @ opp_table : OPP table returned by dev_pm_opp_set_supported_hw ( ) .
2015-12-09 05:31:46 +03:00
*
* This is required only for the V2 bindings , and is called for a matching
2016-02-16 11:47:53 +03:00
* dev_pm_opp_set_supported_hw ( ) . Until this is called , the opp_table structure
2015-12-09 05:31:46 +03:00
* will not be freed .
*/
2017-01-23 07:41:43 +03:00
void dev_pm_opp_put_supported_hw ( struct opp_table * opp_table )
2015-12-09 05:31:46 +03:00
{
2016-02-16 11:47:53 +03:00
/* Make sure there are no concurrent readers while updating opp_table */
WARN_ON ( ! list_empty ( & opp_table - > opp_list ) ) ;
2015-12-09 05:31:46 +03:00
2016-02-16 11:47:53 +03:00
if ( ! opp_table - > supported_hw ) {
2017-01-23 07:41:43 +03:00
pr_err ( " %s: Doesn't have supported hardware list \n " ,
__func__ ) ;
return ;
2015-12-09 05:31:46 +03:00
}
2016-02-16 11:47:53 +03:00
kfree ( opp_table - > supported_hw ) ;
opp_table - > supported_hw = NULL ;
opp_table - > supported_hw_count = 0 ;
2015-12-09 05:31:46 +03:00
2017-01-23 07:41:43 +03:00
dev_pm_opp_put_opp_table ( opp_table ) ;
2015-12-09 05:31:46 +03:00
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_put_supported_hw ) ;
2015-12-09 05:31:47 +03:00
/**
* dev_pm_opp_set_prop_name ( ) - Set prop - extn name
2016-02-16 11:47:52 +03:00
* @ dev : Device for which the prop - name has to be set .
2015-12-09 05:31:47 +03:00
* @ name : name to postfix to properties .
*
* This is required only for the V2 bindings , and it enables a platform to
* specify the extn to be used for certain property names . The properties to
* which the extension will apply are opp - microvolt and opp - microamp . OPP core
* should postfix the property name with - < name > while looking for them .
*/
2017-01-23 07:41:43 +03:00
struct opp_table * dev_pm_opp_set_prop_name ( struct device * dev , const char * name )
2015-12-09 05:31:47 +03:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2017-01-23 07:41:43 +03:00
int ret ;
2015-12-09 05:31:47 +03:00
2017-01-23 07:41:43 +03:00
opp_table = dev_pm_opp_get_opp_table ( dev ) ;
if ( ! opp_table )
return ERR_PTR ( - ENOMEM ) ;
2015-12-09 05:31:47 +03:00
2016-02-16 11:47:53 +03:00
/* Make sure there are no concurrent readers while updating opp_table */
WARN_ON ( ! list_empty ( & opp_table - > opp_list ) ) ;
2015-12-09 05:31:47 +03:00
2016-02-16 11:47:53 +03:00
/* Do we already have a prop-name associated with opp_table? */
if ( opp_table - > prop_name ) {
2015-12-09 05:31:47 +03:00
dev_err ( dev , " %s: Already have prop-name %s \n " , __func__ ,
2016-02-16 11:47:53 +03:00
opp_table - > prop_name ) ;
2015-12-09 05:31:47 +03:00
ret = - EBUSY ;
goto err ;
}
2016-02-16 11:47:53 +03:00
opp_table - > prop_name = kstrdup ( name , GFP_KERNEL ) ;
if ( ! opp_table - > prop_name ) {
2015-12-09 05:31:47 +03:00
ret = - ENOMEM ;
goto err ;
}
2017-01-23 07:41:43 +03:00
return opp_table ;
2015-12-09 05:31:47 +03:00
err :
2017-01-23 07:41:43 +03:00
dev_pm_opp_put_opp_table ( opp_table ) ;
2015-12-09 05:31:47 +03:00
2017-01-23 07:41:43 +03:00
return ERR_PTR ( ret ) ;
2015-12-09 05:31:47 +03:00
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_set_prop_name ) ;
/**
* dev_pm_opp_put_prop_name ( ) - Releases resources blocked for prop - name
2017-01-23 07:41:43 +03:00
* @ opp_table : OPP table returned by dev_pm_opp_set_prop_name ( ) .
2015-12-09 05:31:47 +03:00
*
* This is required only for the V2 bindings , and is called for a matching
2016-02-16 11:47:53 +03:00
* dev_pm_opp_set_prop_name ( ) . Until this is called , the opp_table structure
2015-12-09 05:31:47 +03:00
* will not be freed .
*/
2017-01-23 07:41:43 +03:00
void dev_pm_opp_put_prop_name ( struct opp_table * opp_table )
2015-12-09 05:31:47 +03:00
{
2016-02-16 11:47:53 +03:00
/* Make sure there are no concurrent readers while updating opp_table */
WARN_ON ( ! list_empty ( & opp_table - > opp_list ) ) ;
2015-12-09 05:31:47 +03:00
2016-02-16 11:47:53 +03:00
if ( ! opp_table - > prop_name ) {
2017-01-23 07:41:43 +03:00
pr_err ( " %s: Doesn't have a prop-name \n " , __func__ ) ;
return ;
2015-12-09 05:31:47 +03:00
}
2016-02-16 11:47:53 +03:00
kfree ( opp_table - > prop_name ) ;
opp_table - > prop_name = NULL ;
2015-12-09 05:31:47 +03:00
2017-01-23 07:41:43 +03:00
dev_pm_opp_put_opp_table ( opp_table ) ;
2015-12-09 05:31:47 +03:00
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_put_prop_name ) ;
2016-12-01 13:58:20 +03:00
static int _allocate_set_opp_data ( struct opp_table * opp_table )
{
struct dev_pm_set_opp_data * data ;
int len , count = opp_table - > regulator_count ;
if ( WARN_ON ( ! count ) )
return - EINVAL ;
/* space for set_opp_data */
len = sizeof ( * data ) ;
/* space for old_opp.supplies and new_opp.supplies */
len + = 2 * sizeof ( struct dev_pm_opp_supply ) * count ;
data = kzalloc ( len , GFP_KERNEL ) ;
if ( ! data )
return - ENOMEM ;
data - > old_opp . supplies = ( void * ) ( data + 1 ) ;
data - > new_opp . supplies = data - > old_opp . supplies + count ;
opp_table - > set_opp_data = data ;
return 0 ;
}
static void _free_set_opp_data ( struct opp_table * opp_table )
{
kfree ( opp_table - > set_opp_data ) ;
opp_table - > set_opp_data = NULL ;
}
2016-02-09 08:00:33 +03:00
/**
2016-12-01 13:58:19 +03:00
* dev_pm_opp_set_regulators ( ) - Set regulator names for the device
2016-02-09 08:00:33 +03:00
* @ dev : Device for which regulator name is being set .
2016-12-01 13:58:19 +03:00
* @ names : Array of pointers to the names of the regulator .
* @ count : Number of regulators .
2016-02-09 08:00:33 +03:00
*
* In order to support OPP switching , OPP layer needs to know the name of the
2016-12-01 13:58:19 +03:00
* device ' s regulators , as the core would be required to switch voltages as
* well .
2016-02-09 08:00:33 +03:00
*
* This must be called before any OPPs are initialized for the device .
*/
2016-12-01 13:58:19 +03:00
struct opp_table * dev_pm_opp_set_regulators ( struct device * dev ,
const char * const names [ ] ,
unsigned int count )
2016-02-09 08:00:33 +03:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2016-02-09 08:00:33 +03:00
struct regulator * reg ;
2016-12-01 13:58:19 +03:00
int ret , i ;
2016-02-09 08:00:33 +03:00
2017-01-23 07:41:43 +03:00
opp_table = dev_pm_opp_get_opp_table ( dev ) ;
if ( ! opp_table )
return ERR_PTR ( - ENOMEM ) ;
2016-02-09 08:00:33 +03:00
/* This should be called before OPPs are initialized */
2016-02-16 11:47:53 +03:00
if ( WARN_ON ( ! list_empty ( & opp_table - > opp_list ) ) ) {
2016-02-09 08:00:33 +03:00
ret = - EBUSY ;
goto err ;
}
2016-12-01 13:58:19 +03:00
/* Already have regulators set */
2016-12-01 13:58:22 +03:00
if ( opp_table - > regulators ) {
2016-02-09 08:00:33 +03:00
ret = - EBUSY ;
goto err ;
}
2016-12-01 13:58:19 +03:00
opp_table - > regulators = kmalloc_array ( count ,
sizeof ( * opp_table - > regulators ) ,
GFP_KERNEL ) ;
if ( ! opp_table - > regulators ) {
ret = - ENOMEM ;
2016-02-09 08:00:33 +03:00
goto err ;
}
2016-12-01 13:58:19 +03:00
for ( i = 0 ; i < count ; i + + ) {
reg = regulator_get_optional ( dev , names [ i ] ) ;
if ( IS_ERR ( reg ) ) {
ret = PTR_ERR ( reg ) ;
if ( ret ! = - EPROBE_DEFER )
dev_err ( dev , " %s: no regulator (%s) found: %d \n " ,
__func__ , names [ i ] , ret ) ;
goto free_regulators ;
}
opp_table - > regulators [ i ] = reg ;
}
opp_table - > regulator_count = count ;
2016-02-09 08:00:33 +03:00
2016-12-01 13:58:20 +03:00
/* Allocate block only once to pass to set_opp() routines */
ret = _allocate_set_opp_data ( opp_table ) ;
if ( ret )
goto free_regulators ;
2016-11-30 13:51:25 +03:00
return opp_table ;
2016-02-09 08:00:33 +03:00
2016-12-01 13:58:19 +03:00
free_regulators :
while ( i ! = 0 )
regulator_put ( opp_table - > regulators [ - - i ] ) ;
kfree ( opp_table - > regulators ) ;
opp_table - > regulators = NULL ;
2016-12-01 13:58:20 +03:00
opp_table - > regulator_count = 0 ;
2016-02-09 08:00:33 +03:00
err :
2017-01-23 07:41:43 +03:00
dev_pm_opp_put_opp_table ( opp_table ) ;
2016-02-09 08:00:33 +03:00
2016-11-30 13:51:25 +03:00
return ERR_PTR ( ret ) ;
2016-02-09 08:00:33 +03:00
}
2016-12-01 13:58:19 +03:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_set_regulators ) ;
2016-02-09 08:00:33 +03:00
/**
2016-12-01 13:58:19 +03:00
* dev_pm_opp_put_regulators ( ) - Releases resources blocked for regulator
* @ opp_table : OPP table returned from dev_pm_opp_set_regulators ( ) .
2016-02-09 08:00:33 +03:00
*/
2016-12-01 13:58:19 +03:00
void dev_pm_opp_put_regulators ( struct opp_table * opp_table )
2016-02-09 08:00:33 +03:00
{
2016-12-01 13:58:19 +03:00
int i ;
if ( ! opp_table - > regulators ) {
pr_err ( " %s: Doesn't have regulators set \n " , __func__ ) ;
2017-01-23 07:41:43 +03:00
return ;
2016-02-09 08:00:33 +03:00
}
2016-02-16 11:47:53 +03:00
/* Make sure there are no concurrent readers while updating opp_table */
WARN_ON ( ! list_empty ( & opp_table - > opp_list ) ) ;
2016-02-09 08:00:33 +03:00
2016-12-01 13:58:19 +03:00
for ( i = opp_table - > regulator_count - 1 ; i > = 0 ; i - - )
regulator_put ( opp_table - > regulators [ i ] ) ;
2016-12-01 13:58:20 +03:00
_free_set_opp_data ( opp_table ) ;
2016-12-01 13:58:19 +03:00
kfree ( opp_table - > regulators ) ;
opp_table - > regulators = NULL ;
opp_table - > regulator_count = 0 ;
2016-02-09 08:00:33 +03:00
2017-01-23 07:41:43 +03:00
dev_pm_opp_put_opp_table ( opp_table ) ;
2016-02-09 08:00:33 +03:00
}
2016-12-01 13:58:19 +03:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_put_regulators ) ;
2016-02-09 08:00:33 +03:00
2016-12-01 13:58:21 +03:00
/**
* dev_pm_opp_register_set_opp_helper ( ) - Register custom set OPP helper
* @ dev : Device for which the helper is getting registered .
* @ set_opp : Custom set OPP helper .
*
* This is useful to support complex platforms ( like platforms with multiple
* regulators per device ) , instead of the generic OPP set rate helper .
*
* This must be called before any OPPs are initialized for the device .
*/
2017-01-23 07:41:43 +03:00
struct opp_table * dev_pm_opp_register_set_opp_helper ( struct device * dev ,
2016-12-01 13:58:21 +03:00
int ( * set_opp ) ( struct dev_pm_set_opp_data * data ) )
{
struct opp_table * opp_table ;
int ret ;
if ( ! set_opp )
2017-01-23 07:41:43 +03:00
return ERR_PTR ( - EINVAL ) ;
2016-12-01 13:58:21 +03:00
2017-01-23 07:41:43 +03:00
opp_table = dev_pm_opp_get_opp_table ( dev ) ;
if ( ! opp_table )
return ERR_PTR ( - ENOMEM ) ;
2016-12-01 13:58:21 +03:00
/* This should be called before OPPs are initialized */
if ( WARN_ON ( ! list_empty ( & opp_table - > opp_list ) ) ) {
ret = - EBUSY ;
goto err ;
}
/* Already have custom set_opp helper */
if ( WARN_ON ( opp_table - > set_opp ) ) {
ret = - EBUSY ;
goto err ;
}
opp_table - > set_opp = set_opp ;
2017-01-23 07:41:43 +03:00
return opp_table ;
2016-12-01 13:58:21 +03:00
err :
2017-01-23 07:41:43 +03:00
dev_pm_opp_put_opp_table ( opp_table ) ;
2016-12-01 13:58:21 +03:00
2017-01-23 07:41:43 +03:00
return ERR_PTR ( ret ) ;
2016-12-01 13:58:21 +03:00
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_register_set_opp_helper ) ;
/**
* dev_pm_opp_register_put_opp_helper ( ) - Releases resources blocked for
* set_opp helper
2017-01-23 07:41:43 +03:00
* @ opp_table : OPP table returned from dev_pm_opp_register_set_opp_helper ( ) .
2016-12-01 13:58:21 +03:00
*
2017-01-23 07:41:43 +03:00
* Release resources blocked for platform specific set_opp helper .
2016-12-01 13:58:21 +03:00
*/
2017-01-23 07:41:43 +03:00
void dev_pm_opp_register_put_opp_helper ( struct opp_table * opp_table )
2016-12-01 13:58:21 +03:00
{
if ( ! opp_table - > set_opp ) {
2017-01-23 07:41:43 +03:00
pr_err ( " %s: Doesn't have custom set_opp helper set \n " ,
__func__ ) ;
return ;
2016-12-01 13:58:21 +03:00
}
/* Make sure there are no concurrent readers while updating opp_table */
WARN_ON ( ! list_empty ( & opp_table - > opp_list ) ) ;
opp_table - > set_opp = NULL ;
2017-01-23 07:41:43 +03:00
dev_pm_opp_put_opp_table ( opp_table ) ;
2016-12-01 13:58:21 +03:00
}
EXPORT_SYMBOL_GPL ( dev_pm_opp_register_put_opp_helper ) ;
2014-11-25 13:34:18 +03:00
/**
* dev_pm_opp_add ( ) - Add an OPP table from a table definitions
* @ dev : device for which we do this operation
* @ freq : Frequency in Hz for this OPP
* @ u_volt : Voltage in uVolts for this OPP
*
2016-02-16 11:47:53 +03:00
* This function adds an opp definition to the opp table and returns status .
2014-11-25 13:34:18 +03:00
* The opp is made available by default and it can be controlled using
* dev_pm_opp_enable / disable functions .
*
2016-02-16 11:47:53 +03:00
* Locking : The internal opp_table and opp structures are RCU protected .
2014-11-25 13:34:18 +03:00
* Hence this function internally uses RCU updater strategy with mutex locks
* to keep the integrity of the internal data structures . Callers should ensure
* that this function is * NOT * called under RCU protection or in contexts where
* mutex cannot be locked .
*
* Return :
2014-12-24 20:22:57 +03:00
* 0 On success OR
2014-11-25 13:34:18 +03:00
* Duplicate OPPs ( both freq and volt are same ) and opp - > available
2014-12-24 20:22:57 +03:00
* - EEXIST Freq are same and volt are different OR
2014-11-25 13:34:18 +03:00
* Duplicate OPPs ( both freq and volt are same ) and ! opp - > available
2014-12-24 20:22:57 +03:00
* - ENOMEM Memory allocation failure
2014-11-25 13:34:18 +03:00
*/
int dev_pm_opp_add ( struct device * dev , unsigned long freq , unsigned long u_volt )
{
2017-01-02 12:11:01 +03:00
struct opp_table * opp_table ;
int ret ;
/* Hold our table modification lock here */
mutex_lock ( & opp_table_lock ) ;
opp_table = _add_opp_table ( dev ) ;
if ( ! opp_table ) {
ret = - ENOMEM ;
goto unlock ;
}
ret = _opp_add_v1 ( opp_table , dev , freq , u_volt , true ) ;
if ( ret )
_remove_opp_table ( opp_table ) ;
unlock :
mutex_unlock ( & opp_table_lock ) ;
return ret ;
2014-11-25 13:34:18 +03:00
}
2013-09-20 01:03:50 +04:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_add ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/**
2014-12-24 20:22:56 +03:00
* _opp_set_availability ( ) - helper to set the availability of an opp
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* @ dev : device for which we do this operation
* @ freq : OPP frequency to modify availability
* @ availability_req : availability status requested for this opp
*
* Set the availability of an OPP with an RCU operation , opp_ { enable , disable }
* share a common logic which is isolated here .
*
2014-12-24 20:22:57 +03:00
* Return : - EINVAL for bad pointers , - ENOMEM if no memory available for the
2015-09-24 22:28:44 +03:00
* copy operation , returns 0 if no modification was done OR modification was
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* successful .
*
2016-02-16 11:47:53 +03:00
* Locking : The internal opp_table and opp structures are RCU protected .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* Hence this function internally uses RCU updater strategy with mutex locks to
* keep the integrity of the internal data structures . Callers should ensure
* that this function is * NOT * called under RCU protection or in contexts where
* mutex locking or synchronize_rcu ( ) blocking calls cannot be used .
*/
2014-12-24 20:22:56 +03:00
static int _opp_set_availability ( struct device * dev , unsigned long freq ,
bool availability_req )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2016-02-16 11:47:53 +03:00
struct opp_table * opp_table ;
2013-09-20 01:03:51 +04:00
struct dev_pm_opp * new_opp , * tmp_opp , * opp = ERR_PTR ( - ENODEV ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
int r = 0 ;
/* keep the node allocated */
2013-09-20 01:03:51 +04:00
new_opp = kmalloc ( sizeof ( * new_opp ) , GFP_KERNEL ) ;
2015-02-09 12:45:32 +03:00
if ( ! new_opp )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
return - ENOMEM ;
2016-02-16 11:47:53 +03:00
mutex_lock ( & opp_table_lock ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2016-02-16 11:47:53 +03:00
/* Find the opp_table */
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) ) {
r = PTR_ERR ( opp_table ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
dev_warn ( dev , " %s: Device OPP not found (%d) \n " , __func__ , r ) ;
goto unlock ;
}
2017-01-23 07:41:41 +03:00
mutex_lock ( & opp_table - > lock ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/* Do we have the frequency? */
2016-02-16 11:47:53 +03:00
list_for_each_entry ( tmp_opp , & opp_table - > opp_list , node ) {
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
if ( tmp_opp - > rate = = freq ) {
opp = tmp_opp ;
break ;
}
}
2017-01-23 07:41:41 +03:00
mutex_unlock ( & opp_table - > lock ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
if ( IS_ERR ( opp ) ) {
r = PTR_ERR ( opp ) ;
goto unlock ;
}
/* Is update really needed? */
if ( opp - > available = = availability_req )
goto unlock ;
/* copy the old data over */
* new_opp = * opp ;
/* plug in new node */
new_opp - > available = availability_req ;
list_replace_rcu ( & opp - > node , & new_opp - > node ) ;
2016-02-16 11:47:53 +03:00
mutex_unlock ( & opp_table_lock ) ;
call_srcu ( & opp_table - > srcu_head . srcu , & opp - > rcu_head , _kfree_opp_rcu ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2011-10-01 00:35:12 +04:00
/* Notify the change of the OPP availability */
if ( availability_req )
2016-02-16 11:47:53 +03:00
srcu_notifier_call_chain ( & opp_table - > srcu_head ,
OPP_EVENT_ENABLE , new_opp ) ;
2011-10-01 00:35:12 +04:00
else
2016-02-16 11:47:53 +03:00
srcu_notifier_call_chain ( & opp_table - > srcu_head ,
OPP_EVENT_DISABLE , new_opp ) ;
2011-10-01 00:35:12 +04:00
2012-10-23 03:21:49 +04:00
return 0 ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
unlock :
2016-02-16 11:47:53 +03:00
mutex_unlock ( & opp_table_lock ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
kfree ( new_opp ) ;
return r ;
}
/**
2013-09-20 01:03:50 +04:00
* dev_pm_opp_enable ( ) - Enable a specific OPP
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* @ dev : device for which we do this operation
* @ freq : OPP frequency to enable
*
* Enables a provided opp . If the operation is valid , this returns 0 , else the
* corresponding error value . It is meant to be used for users an OPP available
2013-09-20 01:03:50 +04:00
* after being temporarily made unavailable with dev_pm_opp_disable .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*
2016-02-16 11:47:53 +03:00
* Locking : The internal opp_table and opp structures are RCU protected .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* Hence this function indirectly uses RCU and mutex locks to keep the
* integrity of the internal data structures . Callers should ensure that
* this function is * NOT * called under RCU protection or in contexts where
* mutex locking or synchronize_rcu ( ) blocking calls cannot be used .
2014-12-24 20:22:57 +03:00
*
* Return : - EINVAL for bad pointers , - ENOMEM if no memory available for the
2015-09-24 22:28:44 +03:00
* copy operation , returns 0 if no modification was done OR modification was
2014-12-24 20:22:57 +03:00
* successful .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*/
2013-09-20 01:03:50 +04:00
int dev_pm_opp_enable ( struct device * dev , unsigned long freq )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2014-12-24 20:22:56 +03:00
return _opp_set_availability ( dev , freq , true ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
}
2013-09-20 01:03:50 +04:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_enable ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
/**
2013-09-20 01:03:50 +04:00
* dev_pm_opp_disable ( ) - Disable a specific OPP
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* @ dev : device for which we do this operation
* @ freq : OPP frequency to disable
*
* Disables a provided opp . If the operation is valid , this returns
* 0 , else the corresponding error value . It is meant to be a temporary
* control by users to make this OPP not available until the circumstances are
2013-09-20 01:03:50 +04:00
* right to make it available again ( with a call to dev_pm_opp_enable ) .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*
2016-02-16 11:47:53 +03:00
* Locking : The internal opp_table and opp structures are RCU protected .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
* Hence this function indirectly uses RCU and mutex locks to keep the
* integrity of the internal data structures . Callers should ensure that
* this function is * NOT * called under RCU protection or in contexts where
* mutex locking or synchronize_rcu ( ) blocking calls cannot be used .
2014-12-24 20:22:57 +03:00
*
* Return : - EINVAL for bad pointers , - ENOMEM if no memory available for the
2015-09-24 22:28:44 +03:00
* copy operation , returns 0 if no modification was done OR modification was
2014-12-24 20:22:57 +03:00
* successful .
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
*/
2013-09-20 01:03:50 +04:00
int dev_pm_opp_disable ( struct device * dev , unsigned long freq )
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
{
2014-12-24 20:22:56 +03:00
return _opp_set_availability ( dev , freq , false ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
}
2013-09-20 01:03:50 +04:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_disable ) ;
PM: Introduce library for device-specific OPPs (v7)
SoCs have a standard set of tuples consisting of frequency and
voltage pairs that the device will support per voltage domain. These
are called Operating Performance Points or OPPs. The actual
definitions of OPP varies over silicon versions. For a specific domain,
we can have a set of {frequency, voltage} pairs. As the kernel boots
and more information is available, a default set of these are activated
based on the precise nature of device. Further on operation, based on
conditions prevailing in the system (such as temperature), some OPP
availability may be temporarily controlled by the SoC frameworks.
To implement an OPP, some sort of power management support is necessary
hence this library depends on CONFIG_PM.
Contributions include:
Sanjeev Premi for the initial concept:
http://patchwork.kernel.org/patch/50998/
Kevin Hilman for converting original design to device-based.
Kevin Hilman and Paul Walmsey for cleaning up many of the function
abstractions, improvements and data structure handling.
Romit Dasgupta for using enums instead of opp pointers.
Thara Gopinath, Eduardo Valentin and Vishwanath BS for fixes and
cleanups.
Linus Walleij for recommending this layer be made generic for usage
in other architectures beyond OMAP and ARM.
Mark Brown, Andrew Morton, Rafael J. Wysocki, Paul E. McKenney for
valuable improvements.
Discussions and comments from:
http://marc.info/?l=linux-omap&m=126033945313269&w=2
http://marc.info/?l=linux-omap&m=125482970102327&w=2
http://marc.info/?t=125809247500002&r=1&w=2
http://marc.info/?l=linux-omap&m=126025973426007&w=2
http://marc.info/?t=128152609200064&r=1&w=2
http://marc.info/?t=128468723000002&r=1&w=2
incorporated.
v1: http://marc.info/?t=128468723000002&r=1&w=2
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
2010-10-13 02:13:10 +04:00
2011-10-01 00:35:12 +04:00
/**
2017-01-02 12:11:03 +03:00
* dev_pm_opp_register_notifier ( ) - Register OPP notifier for the device
* @ dev : Device for which notifier needs to be registered
* @ nb : Notifier block to be registered
2014-12-24 20:22:57 +03:00
*
2017-01-02 12:11:03 +03:00
* Return : 0 on success or a negative error value .
*/
int dev_pm_opp_register_notifier ( struct device * dev , struct notifier_block * nb )
{
struct opp_table * opp_table ;
int ret ;
rcu_read_lock ( ) ;
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) ) {
ret = PTR_ERR ( opp_table ) ;
goto unlock ;
}
ret = srcu_notifier_chain_register ( & opp_table - > srcu_head , nb ) ;
unlock :
rcu_read_unlock ( ) ;
return ret ;
}
EXPORT_SYMBOL ( dev_pm_opp_register_notifier ) ;
/**
* dev_pm_opp_unregister_notifier ( ) - Unregister OPP notifier for the device
* @ dev : Device for which notifier needs to be unregistered
* @ nb : Notifier block to be unregistered
2014-12-24 20:22:57 +03:00
*
2017-01-02 12:11:03 +03:00
* Return : 0 on success or a negative error value .
2011-10-01 00:35:12 +04:00
*/
2017-01-02 12:11:03 +03:00
int dev_pm_opp_unregister_notifier ( struct device * dev ,
struct notifier_block * nb )
2011-10-01 00:35:12 +04:00
{
2017-01-02 12:11:03 +03:00
struct opp_table * opp_table ;
int ret ;
2011-10-01 00:35:12 +04:00
2017-01-02 12:11:03 +03:00
rcu_read_lock ( ) ;
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) ) {
ret = PTR_ERR ( opp_table ) ;
goto unlock ;
}
ret = srcu_notifier_chain_unregister ( & opp_table - > srcu_head , nb ) ;
2011-10-01 00:35:12 +04:00
2017-01-02 12:11:03 +03:00
unlock :
rcu_read_unlock ( ) ;
return ret ;
2011-10-01 00:35:12 +04:00
}
2017-01-02 12:11:03 +03:00
EXPORT_SYMBOL ( dev_pm_opp_unregister_notifier ) ;
2012-09-05 03:09:12 +04:00
2016-05-03 17:05:04 +03:00
/*
* Free OPPs either created using static entries present in DT or even the
* dynamically added entries based on remove_all param .
2012-09-05 03:09:12 +04:00
*/
2017-01-02 12:11:01 +03:00
void _dev_pm_opp_remove_table ( struct opp_table * opp_table , struct device * dev ,
bool remove_all )
2015-07-29 13:52:58 +03:00
{
struct dev_pm_opp * opp , * tmp ;
2017-01-02 12:11:00 +03:00
opp_rcu_lockdep_assert ( ) ;
/* Find if opp_table manages a single device */
if ( list_is_singular ( & opp_table - > dev_list ) ) {
/* Free static OPPs */
list_for_each_entry_safe ( opp , tmp , & opp_table - > opp_list , node ) {
if ( remove_all | | ! opp - > dynamic )
_opp_remove ( opp_table , opp ) ;
}
} else {
_remove_opp_dev ( _find_opp_dev ( dev , opp_table ) , opp_table ) ;
}
}
void _dev_pm_opp_find_and_remove_table ( struct device * dev , bool remove_all )
{
struct opp_table * opp_table ;
2016-02-16 11:47:53 +03:00
/* Hold our table modification lock here */
mutex_lock ( & opp_table_lock ) ;
2015-07-29 13:53:04 +03:00
2016-02-16 11:47:53 +03:00
/* Check for existing table for 'dev' */
opp_table = _find_opp_table ( dev ) ;
if ( IS_ERR ( opp_table ) ) {
int error = PTR_ERR ( opp_table ) ;
2015-07-29 13:52:58 +03:00
if ( error ! = - ENODEV )
2016-02-16 11:47:53 +03:00
WARN ( 1 , " %s: opp_table: %d \n " ,
2015-07-29 13:52:58 +03:00
IS_ERR_OR_NULL ( dev ) ?
" Invalid device " : dev_name ( dev ) ,
error ) ;
2015-07-29 13:53:04 +03:00
goto unlock ;
2015-07-29 13:52:58 +03:00
}
2017-01-02 12:11:00 +03:00
_dev_pm_opp_remove_table ( opp_table , dev , remove_all ) ;
2015-07-29 13:52:58 +03:00
2015-07-29 13:53:04 +03:00
unlock :
2016-02-16 11:47:53 +03:00
mutex_unlock ( & opp_table_lock ) ;
2015-07-29 13:52:58 +03:00
}
2014-11-27 06:24:06 +03:00
/**
2016-05-03 17:05:04 +03:00
* dev_pm_opp_remove_table ( ) - Free all OPPs associated with the device
2016-02-16 11:47:53 +03:00
* @ dev : device pointer used to lookup OPP table .
2014-11-27 06:24:06 +03:00
*
2016-05-03 17:05:04 +03:00
* Free both OPPs created using static entries present in DT and the
* dynamically added entries .
2014-12-24 20:22:57 +03:00
*
2016-02-16 11:47:53 +03:00
* Locking : The internal opp_table and opp structures are RCU protected .
2014-12-24 20:22:57 +03:00
* Hence this function indirectly uses RCU updater strategy with mutex locks
* to keep the integrity of the internal data structures . Callers should ensure
* that this function is * NOT * called under RCU protection or in contexts where
* mutex cannot be locked .
2014-11-27 06:24:06 +03:00
*/
2016-05-03 17:05:04 +03:00
void dev_pm_opp_remove_table ( struct device * dev )
2014-11-27 06:24:06 +03:00
{
2017-01-02 12:11:00 +03:00
_dev_pm_opp_find_and_remove_table ( dev , true ) ;
2015-06-12 14:40:38 +03:00
}
2016-05-03 17:05:04 +03:00
EXPORT_SYMBOL_GPL ( dev_pm_opp_remove_table ) ;