mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	Merge branches 'for-4.11/upstream-fixes', 'for-4.12/accutouch', 'for-4.12/cp2112', 'for-4.12/hid-core-null-state-handling', 'for-4.12/hiddev', 'for-4.12/i2c-hid', 'for-4.12/innomedia', 'for-4.12/logitech-hidpp-battery-power-supply', 'for-4.12/multitouch', 'for-4.12/nti', 'for-4.12/upstream' and 'for-4.12/wacom' into for-linus
This commit is contained in:
		
							parent
							
								
									d529a4ad91
								
							
								
									c846fe9ce9
								
							
								
									ac34b970a9
								
							
								
									c3883fe064
								
							
								
									733aca9030
								
							
								
									d3d9adfe30
								
							
								
									9547837bdc
								
							
								
									a4bf6153b3
								
							
								
									e9d0a26d34
								
							
								
									07e88a35dc
								
							
								
									959d973e98
								
							
								
									149f6f6b8f
								
							
						
					
					
						commit
						18fc2163b8
					
				
					 2444 changed files with 74755 additions and 35272 deletions
				
			
		
							
								
								
									
										25
									
								
								Documentation/ABI/testing/sysfs-class-devfreq-event
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Documentation/ABI/testing/sysfs-class-devfreq-event
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| What:		/sys/class/devfreq-event/event(x)/ | ||||
| Date:		January 2017 | ||||
| Contact:	Chanwoo Choi <cw00.choi@samsung.com> | ||||
| Description: | ||||
| 		Provide a place in sysfs for the devfreq-event objects. | ||||
| 		This allows accessing various devfreq-event specific variables. | ||||
| 		The name of devfreq-event object denoted as 'event(x)' which | ||||
| 		includes the unique number of 'x' for each devfreq-event object. | ||||
| 
 | ||||
| What:		/sys/class/devfreq-event/event(x)/name | ||||
| Date:		January 2017 | ||||
| Contact:	Chanwoo Choi <cw00.choi@samsung.com> | ||||
| Description: | ||||
| 		The /sys/class/devfreq-event/event(x)/name attribute contains | ||||
| 		the name of the devfreq-event object. This attribute is | ||||
| 		read-only. | ||||
| 
 | ||||
| What:		/sys/class/devfreq-event/event(x)/enable_count | ||||
| Date:		January 2017 | ||||
| Contact:	Chanwoo Choi <cw00.choi@samsung.com> | ||||
| Description: | ||||
| 		The /sys/class/devfreq-event/event(x)/enable_count attribute | ||||
| 		contains the reference count to enable the devfreq-event | ||||
| 		object. If the device is enabled, the value of attribute is | ||||
| 		greater than zero. | ||||
|  | @ -23,6 +23,23 @@ Description: | |||
| 		If the LED does not support different brightness levels, this | ||||
| 		should be 1. | ||||
| 
 | ||||
| What:		/sys/class/leds/<led>/brightness_hw_changed | ||||
| Date:		January 2017 | ||||
| KernelVersion:	4.11 | ||||
| Description: | ||||
| 		Last hardware set brightness level for this LED. Some LEDs | ||||
| 		may be changed autonomously by hardware/firmware. Only LEDs | ||||
| 		where this happens and the driver can detect this, will have | ||||
| 		this file. | ||||
| 
 | ||||
| 		This file supports poll() to detect when the hardware changes | ||||
| 		the brightness. | ||||
| 
 | ||||
| 		Reading this file will return the last brightness level set | ||||
| 		by the hardware, this may be different from the current | ||||
| 		brightness. Reading this file when no hw brightness change | ||||
| 		event has happened will return an ENODATA error. | ||||
| 
 | ||||
| What:		/sys/class/leds/<led>/trigger | ||||
| Date:		March 2006 | ||||
| KernelVersion:	2.6.17 | ||||
|  |  | |||
|  | @ -62,18 +62,18 @@ Description: | |||
| 		This value may be reset to 0 if the current protocol is altered. | ||||
| 
 | ||||
| What:		/sys/class/rc/rcN/wakeup_protocols | ||||
| Date:		Feb 2014 | ||||
| KernelVersion:	3.15 | ||||
| Date:		Feb 2017 | ||||
| KernelVersion:	4.11 | ||||
| Contact:	Mauro Carvalho Chehab <m.chehab@samsung.com> | ||||
| Description: | ||||
| 		Reading this file returns a list of available protocols to use | ||||
| 		for the wakeup filter, something like: | ||||
| 		    "rc5 rc6 nec jvc [sony]" | ||||
| 		    "rc-5 nec nec-x rc-6-0 rc-6-6a-24 [rc-6-6a-32] rc-6-mce" | ||||
| 		Note that protocol variants are listed, so "nec", "sony", | ||||
| 		"rc-5", "rc-6" have their different bit length encodings | ||||
| 		listed if available. | ||||
| 		The enabled wakeup protocol is shown in [] brackets. | ||||
| 		Writing "+proto" will add a protocol to the list of enabled | ||||
| 		wakeup protocols. | ||||
| 		Writing "-proto" will remove a protocol from the list of enabled | ||||
| 		wakeup protocols. | ||||
| 		Only one protocol can be selected at a time. | ||||
| 		Writing "proto" will use "proto" for wakeup events. | ||||
| 		Writing "none" will disable wakeup. | ||||
| 		Write fails with EINVAL if an invalid protocol combination or | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ What:		/sys/devices/platform/hidma-*/chid | |||
| 		/sys/devices/platform/QCOM8061:*/chid | ||||
| Date:		Dec 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Contains the ID of the channel within the HIDMA instance. | ||||
| 		It is used to associate a given HIDMA channel with the | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ What:		/sys/devices/platform/hidma-mgmt*/chanops/chan*/priority | |||
| 		/sys/devices/platform/QCOM8060:*/chanops/chan*/priority | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Contains either 0 or 1 and indicates if the DMA channel is a | ||||
| 		low priority (0) or high priority (1) channel. | ||||
|  | @ -11,7 +11,7 @@ What:		/sys/devices/platform/hidma-mgmt*/chanops/chan*/weight | |||
| 		/sys/devices/platform/QCOM8060:*/chanops/chan*/weight | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Contains 0..15 and indicates the weight of the channel among | ||||
| 		equal priority channels during round robin scheduling. | ||||
|  | @ -20,7 +20,7 @@ What:		/sys/devices/platform/hidma-mgmt*/chreset_timeout_cycles | |||
| 		/sys/devices/platform/QCOM8060:*/chreset_timeout_cycles | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Contains the platform specific cycle value to wait after a | ||||
| 		reset command is issued. If the value is chosen too short, | ||||
|  | @ -32,7 +32,7 @@ What:		/sys/devices/platform/hidma-mgmt*/dma_channels | |||
| 		/sys/devices/platform/QCOM8060:*/dma_channels | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Contains the number of dma channels supported by one instance | ||||
| 		of HIDMA hardware. The value may change from chip to chip. | ||||
|  | @ -41,7 +41,7 @@ What:		/sys/devices/platform/hidma-mgmt*/hw_version_major | |||
| 		/sys/devices/platform/QCOM8060:*/hw_version_major | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Version number major for the hardware. | ||||
| 
 | ||||
|  | @ -49,7 +49,7 @@ What:		/sys/devices/platform/hidma-mgmt*/hw_version_minor | |||
| 		/sys/devices/platform/QCOM8060:*/hw_version_minor | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Version number minor for the hardware. | ||||
| 
 | ||||
|  | @ -57,7 +57,7 @@ What:		/sys/devices/platform/hidma-mgmt*/max_rd_xactions | |||
| 		/sys/devices/platform/QCOM8060:*/max_rd_xactions | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Contains a value between 0 and 31. Maximum number of | ||||
| 		read transactions that can be issued back to back. | ||||
|  | @ -69,7 +69,7 @@ What:		/sys/devices/platform/hidma-mgmt*/max_read_request | |||
| 		/sys/devices/platform/QCOM8060:*/max_read_request | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Size of each read request. The value needs to be a power | ||||
| 		of two and can be between 128 and 1024. | ||||
|  | @ -78,7 +78,7 @@ What:		/sys/devices/platform/hidma-mgmt*/max_wr_xactions | |||
| 		/sys/devices/platform/QCOM8060:*/max_wr_xactions | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Contains a value between 0 and 31. Maximum number of | ||||
| 		write transactions that can be issued back to back. | ||||
|  | @ -91,7 +91,7 @@ What:		/sys/devices/platform/hidma-mgmt*/max_write_request | |||
| 		/sys/devices/platform/QCOM8060:*/max_write_request | ||||
| Date:		Nov 2015 | ||||
| KernelVersion:	4.4 | ||||
| Contact:	"Sinan Kaya <okaya@cudeaurora.org>" | ||||
| Contact:	"Sinan Kaya <okaya@codeaurora.org>" | ||||
| Description: | ||||
| 		Size of each write request. The value needs to be a power | ||||
| 		of two and can be between 128 and 1024. | ||||
|  |  | |||
|  | @ -59,28 +59,20 @@ button driver uses the following 3 modes in order not to trigger issues. | |||
| If the userspace hasn't been prepared to ignore the unreliable "opened" | ||||
| events and the unreliable initial state notification, Linux users can use | ||||
| the following kernel parameters to handle the possible issues: | ||||
| A. button.lid_init_state=method: | ||||
|    When this option is specified, the ACPI button driver reports the | ||||
|    initial lid state using the returning value of the _LID control method | ||||
|    and whether the "opened"/"closed" events are paired fully relies on the | ||||
|    firmware implementation. | ||||
|    This option can be used to fix some platforms where the returning value | ||||
|    of the _LID control method is reliable but the initial lid state | ||||
|    notification is missing. | ||||
|    This option is the default behavior during the period the userspace | ||||
|    isn't ready to handle the buggy AML tables. | ||||
| B. button.lid_init_state=open: | ||||
| A. button.lid_init_state=open: | ||||
|    When this option is specified, the ACPI button driver always reports the | ||||
|    initial lid state as "opened" and whether the "opened"/"closed" events | ||||
|    are paired fully relies on the firmware implementation. | ||||
|    This may fix some platforms where the returning value of the _LID | ||||
|    control method is not reliable and the initial lid state notification is | ||||
|    missing. | ||||
|    This option is the default behavior during the period the userspace | ||||
|    isn't ready to handle the buggy AML tables. | ||||
| 
 | ||||
| If the userspace has been prepared to ignore the unreliable "opened" events | ||||
| and the unreliable initial state notification, Linux users should always | ||||
| use the following kernel parameter: | ||||
| C. button.lid_init_state=ignore: | ||||
| B. button.lid_init_state=ignore: | ||||
|    When this option is specified, the ACPI button driver never reports the | ||||
|    initial lid state and there is a compensation mechanism implemented to | ||||
|    ensure that the reliable "closed" notifications can always be delievered | ||||
|  |  | |||
|  | @ -4085,6 +4085,9 @@ | |||
| 	usbhid.mousepoll= | ||||
| 			[USBHID] The interval which mice are to be polled at. | ||||
| 
 | ||||
| 	usbhid.jspoll= | ||||
| 			[USBHID] The interval which joysticks are to be polled at. | ||||
| 
 | ||||
| 	usb-storage.delay_use= | ||||
| 			[UMS] The delay in seconds before a new device is | ||||
| 			scanned for Logical Units (default 1). | ||||
|  |  | |||
|  | @ -249,7 +249,6 @@ struct& cdrom_device_ops\ \{ \hidewidth\cr | |||
|         unsigned\ long);\cr | ||||
| \noalign{\medskip} | ||||
|   &const\ int& capability;& capability flags \cr | ||||
|   &int& n_minors;& number of active minor devices \cr | ||||
| \};\cr | ||||
| } | ||||
| $$ | ||||
|  | @ -258,13 +257,7 @@ it should add a function pointer to this $struct$. When a particular | |||
| function is not implemented, however, this $struct$ should contain a | ||||
| NULL instead. The $capability$ flags specify the capabilities of the | ||||
| \cdrom\ hardware and/or low-level \cdrom\ driver when a \cdrom\ drive | ||||
| is registered with the \UCD. The value $n_minors$ should be a positive | ||||
| value indicating the number of minor devices that are supported by | ||||
| the low-level device driver, normally~1. Although these two variables | ||||
| are `informative' rather than `operational,' they are included in | ||||
| $cdrom_device_ops$ because they describe the capability of the {\em | ||||
| driver\/} rather than the {\em drive}. Nomenclature has always been | ||||
| difficult in computer programming. | ||||
| is registered with the \UCD. | ||||
| 
 | ||||
| Note that most functions have fewer parameters than their | ||||
| $blkdev_fops$ counterparts. This is because very little of the | ||||
|  |  | |||
|  | @ -8,6 +8,8 @@ | |||
| 
 | ||||
| 		    Dominik Brodowski  <linux@brodo.de> | ||||
| 		     David Kimdon <dwhedon@debian.org> | ||||
| 		Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||||
| 		   Viresh Kumar <viresh.kumar@linaro.org> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | @ -36,10 +38,11 @@ speed limits (like LCD drivers on ARM architecture). Additionally, the | |||
| kernel "constant" loops_per_jiffy is updated on frequency changes | ||||
| here. | ||||
| 
 | ||||
| Reference counting is done by cpufreq_get_cpu and cpufreq_put_cpu, | ||||
| which make sure that the cpufreq processor driver is correctly | ||||
| registered with the core, and will not be unloaded until | ||||
| cpufreq_put_cpu is called. | ||||
| Reference counting of the cpufreq policies is done by cpufreq_cpu_get | ||||
| and cpufreq_cpu_put, which make sure that the cpufreq driver is | ||||
| correctly registered with the core, and will not be unloaded until | ||||
| cpufreq_put_cpu is called. That also ensures that the respective cpufreq | ||||
| policy doesn't get freed while being used. | ||||
| 
 | ||||
| 2. CPUFreq notifiers | ||||
| ==================== | ||||
|  | @ -69,18 +72,16 @@ CPUFreq policy notifier is called twice for a policy transition: | |||
| The phase is specified in the second argument to the notifier. | ||||
| 
 | ||||
| The third argument, a void *pointer, points to a struct cpufreq_policy | ||||
| consisting of five values: cpu, min, max, policy and max_cpu_freq. min  | ||||
| and max are the lower and upper frequencies (in kHz) of the new | ||||
| policy, policy the new policy, cpu the number of the affected CPU; and  | ||||
| max_cpu_freq the maximum supported CPU frequency. This value is given  | ||||
| for informational purposes only. | ||||
| consisting of several values, including min, max (the lower and upper | ||||
| frequencies (in kHz) of the new policy). | ||||
| 
 | ||||
| 
 | ||||
| 2.2 CPUFreq transition notifiers | ||||
| -------------------------------- | ||||
| 
 | ||||
| These are notified twice when the CPUfreq driver switches the CPU core | ||||
| frequency and this change has any external implications. | ||||
| These are notified twice for each online CPU in the policy, when the | ||||
| CPUfreq driver switches the CPU core frequency and this change has no | ||||
| any external implications. | ||||
| 
 | ||||
| The second argument specifies the phase - CPUFREQ_PRECHANGE or | ||||
| CPUFREQ_POSTCHANGE. | ||||
|  | @ -90,6 +91,7 @@ values: | |||
| cpu	- number of the affected CPU | ||||
| old	- old frequency | ||||
| new	- new frequency | ||||
| flags	- flags of the cpufreq driver | ||||
| 
 | ||||
| 3. CPUFreq Table Generation with Operating Performance Point (OPP) | ||||
| ================================================================== | ||||
|  |  | |||
|  | @ -9,6 +9,8 @@ | |||
| 
 | ||||
| 
 | ||||
| 		    Dominik Brodowski  <linux@brodo.de> | ||||
| 		Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||||
| 		   Viresh Kumar <viresh.kumar@linaro.org> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | @ -49,49 +51,65 @@ using cpufreq_register_driver() | |||
| 
 | ||||
| What shall this struct cpufreq_driver contain?  | ||||
| 
 | ||||
| cpufreq_driver.name -		The name of this driver. | ||||
|  .name - The name of this driver. | ||||
| 
 | ||||
| cpufreq_driver.init -		A pointer to the per-CPU initialization  | ||||
| 				function. | ||||
|  .init - A pointer to the per-policy initialization function. | ||||
| 
 | ||||
| cpufreq_driver.verify -		A pointer to a "verification" function. | ||||
|  .verify - A pointer to a "verification" function. | ||||
| 
 | ||||
| cpufreq_driver.setpolicy _or_  | ||||
| cpufreq_driver.target/ | ||||
| target_index		-	See below on the differences. | ||||
|  .setpolicy _or_ .fast_switch _or_ .target _or_ .target_index - See | ||||
|  below on the differences. | ||||
| 
 | ||||
| And optionally | ||||
| 
 | ||||
| cpufreq_driver.exit -		A pointer to a per-CPU cleanup | ||||
| 				function called during CPU_POST_DEAD | ||||
| 				phase of cpu hotplug process. | ||||
|  .flags - Hints for the cpufreq core. | ||||
| 
 | ||||
| cpufreq_driver.stop_cpu -	A pointer to a per-CPU stop function | ||||
| 				called during CPU_DOWN_PREPARE phase of | ||||
| 				cpu hotplug process. | ||||
|  .driver_data - cpufreq driver specific data. | ||||
| 
 | ||||
| cpufreq_driver.resume -		A pointer to a per-CPU resume function | ||||
| 				which is called with interrupts disabled | ||||
| 				and _before_ the pre-suspend frequency | ||||
| 				and/or policy is restored by a call to | ||||
| 				->target/target_index or ->setpolicy. | ||||
|  .resolve_freq - Returns the most appropriate frequency for a target | ||||
|  frequency. Doesn't change the frequency though. | ||||
| 
 | ||||
| cpufreq_driver.attr -		A pointer to a NULL-terminated list of | ||||
| 				"struct freq_attr" which allow to | ||||
| 				export values to sysfs. | ||||
|  .get_intermediate and target_intermediate - Used to switch to stable | ||||
|  frequency while changing CPU frequency. | ||||
| 
 | ||||
| cpufreq_driver.get_intermediate | ||||
| and target_intermediate		Used to switch to stable frequency while | ||||
| 				changing CPU frequency. | ||||
|  .get - Returns current frequency of the CPU. | ||||
| 
 | ||||
|  .bios_limit - Returns HW/BIOS max frequency limitations for the CPU. | ||||
| 
 | ||||
|  .exit - A pointer to a per-policy cleanup function called during | ||||
|  CPU_POST_DEAD phase of cpu hotplug process. | ||||
| 
 | ||||
|  .stop_cpu - A pointer to a per-policy stop function called during | ||||
|  CPU_DOWN_PREPARE phase of cpu hotplug process. | ||||
| 
 | ||||
|  .suspend - A pointer to a per-policy suspend function which is called | ||||
|  with interrupts disabled and _after_ the governor is stopped for the | ||||
|  policy. | ||||
| 
 | ||||
|  .resume - A pointer to a per-policy resume function which is called | ||||
|  with interrupts disabled and _before_ the governor is started again. | ||||
| 
 | ||||
|  .ready - A pointer to a per-policy ready function which is called after | ||||
|  the policy is fully initialized. | ||||
| 
 | ||||
|  .attr - A pointer to a NULL-terminated list of "struct freq_attr" which | ||||
|  allow to export values to sysfs. | ||||
| 
 | ||||
|  .boost_enabled - If set, boost frequencies are enabled. | ||||
| 
 | ||||
|  .set_boost - A pointer to a per-policy function to enable/disable boost | ||||
|  frequencies. | ||||
| 
 | ||||
| 
 | ||||
| 1.2 Per-CPU Initialization | ||||
| -------------------------- | ||||
| 
 | ||||
| Whenever a new CPU is registered with the device model, or after the | ||||
| cpufreq driver registers itself, the per-CPU initialization function  | ||||
| cpufreq_driver.init is called. It takes a struct cpufreq_policy | ||||
| *policy as argument. What to do now? | ||||
| cpufreq driver registers itself, the per-policy initialization function | ||||
| cpufreq_driver.init is called if no cpufreq policy existed for the CPU. | ||||
| Note that the .init() and .exit() routines are called only once for the | ||||
| policy and not for each CPU managed by the policy. It takes a struct | ||||
| cpufreq_policy *policy as argument. What to do now? | ||||
| 
 | ||||
| If necessary, activate the CPUfreq support on your CPU. | ||||
| 
 | ||||
|  | @ -117,47 +135,45 @@ policy->governor		must contain the "default policy" for | |||
| 				cpufreq_driver.setpolicy or | ||||
| 				cpufreq_driver.target/target_index is called | ||||
| 				with these values. | ||||
| policy->cpus			Update this with the masks of the | ||||
| 				(online + offline) CPUs that do DVFS | ||||
| 				along with this CPU (i.e.  that share | ||||
| 				clock/voltage rails with it). | ||||
| 
 | ||||
| For setting some of these values (cpuinfo.min[max]_freq, policy->min[max]), the | ||||
| frequency table helpers might be helpful. See the section 2 for more information | ||||
| on them. | ||||
| 
 | ||||
| SMP systems normally have same clock source for a group of cpus. For these the | ||||
| .init() would be called only once for the first online cpu. Here the .init() | ||||
| routine must initialize policy->cpus with mask of all possible cpus (Online + | ||||
| Offline) that share the clock. Then the core would copy this mask onto | ||||
| policy->related_cpus and will reset policy->cpus to carry only online cpus. | ||||
| 
 | ||||
| 
 | ||||
| 1.3 verify | ||||
| ------------ | ||||
| ---------- | ||||
| 
 | ||||
| When the user decides a new policy (consisting of | ||||
| "policy,governor,min,max") shall be set, this policy must be validated | ||||
| so that incompatible values can be corrected. For verifying these | ||||
| values, a frequency table helper and/or the | ||||
| cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned | ||||
| int min_freq, unsigned int max_freq) function might be helpful. See | ||||
| section 2 for details on frequency table helpers. | ||||
| values cpufreq_verify_within_limits(struct cpufreq_policy *policy, | ||||
| unsigned int min_freq, unsigned int max_freq) function might be helpful. | ||||
| See section 2 for details on frequency table helpers. | ||||
| 
 | ||||
| You need to make sure that at least one valid frequency (or operating | ||||
| range) is within policy->min and policy->max. If necessary, increase | ||||
| policy->max first, and only if this is no solution, decrease policy->min. | ||||
| 
 | ||||
| 
 | ||||
| 1.4 target/target_index or setpolicy? | ||||
| ---------------------------- | ||||
| 1.4 target or target_index or setpolicy or fast_switch? | ||||
| ------------------------------------------------------- | ||||
| 
 | ||||
| Most cpufreq drivers or even most cpu frequency scaling algorithms  | ||||
| only allow the CPU to be set to one frequency. For these, you use the | ||||
| ->target/target_index call. | ||||
| only allow the CPU frequency to be set to predefined fixed values. For | ||||
| these, you use the ->target(), ->target_index() or ->fast_switch() | ||||
| callbacks. | ||||
| 
 | ||||
| Some cpufreq-capable processors switch the frequency between certain | ||||
| limits on their own. These shall use the ->setpolicy call | ||||
| Some cpufreq capable processors switch the frequency between certain | ||||
| limits on their own. These shall use the ->setpolicy() callback. | ||||
| 
 | ||||
| 
 | ||||
| 1.5. target/target_index | ||||
| ------------- | ||||
| ------------------------ | ||||
| 
 | ||||
| The target_index call has two arguments: struct cpufreq_policy *policy, | ||||
| and unsigned int index (into the exposed frequency table). | ||||
|  | @ -186,9 +202,20 @@ actual frequency must be determined using the following rules: | |||
| Here again the frequency table helper might assist you - see section 2 | ||||
| for details. | ||||
| 
 | ||||
| 1.6. fast_switch | ||||
| ---------------- | ||||
| 
 | ||||
| 1.6 setpolicy | ||||
| --------------- | ||||
| This function is used for frequency switching from scheduler's context. | ||||
| Not all drivers are expected to implement it, as sleeping from within | ||||
| this callback isn't allowed. This callback must be highly optimized to | ||||
| do switching as fast as possible. | ||||
| 
 | ||||
| This function has two arguments: struct cpufreq_policy *policy and | ||||
| unsigned int target_frequency. | ||||
| 
 | ||||
| 
 | ||||
| 1.7 setpolicy | ||||
| ------------- | ||||
| 
 | ||||
| The setpolicy call only takes a struct cpufreq_policy *policy as | ||||
| argument. You need to set the lower limit of the in-processor or | ||||
|  | @ -198,7 +225,7 @@ setting when policy->policy is CPUFREQ_POLICY_PERFORMANCE, and a | |||
| powersaving-oriented setting when CPUFREQ_POLICY_POWERSAVE. Also check | ||||
| the reference implementation in drivers/cpufreq/longrun.c | ||||
| 
 | ||||
| 1.7 get_intermediate and target_intermediate | ||||
| 1.8 get_intermediate and target_intermediate | ||||
| -------------------------------------------- | ||||
| 
 | ||||
| Only for drivers with target_index() and CPUFREQ_ASYNC_NOTIFICATION unset. | ||||
|  | @ -222,42 +249,36 @@ failures as core would send notifications for that. | |||
| 
 | ||||
| As most cpufreq processors only allow for being set to a few specific | ||||
| frequencies, a "frequency table" with some functions might assist in | ||||
| some work of the processor driver. Such a "frequency table" consists | ||||
| of an array of struct cpufreq_frequency_table entries, with any value in | ||||
| "driver_data" you want to use, and the corresponding frequency in | ||||
| "frequency". At the end of the table, you need to add a | ||||
| cpufreq_frequency_table entry with frequency set to CPUFREQ_TABLE_END. And | ||||
| if you want to skip one entry in the table, set the frequency to  | ||||
| CPUFREQ_ENTRY_INVALID. The entries don't need to be in ascending | ||||
| order. | ||||
| some work of the processor driver. Such a "frequency table" consists of | ||||
| an array of struct cpufreq_frequency_table entries, with driver specific | ||||
| values in "driver_data", the corresponding frequency in "frequency" and | ||||
| flags set. At the end of the table, you need to add a | ||||
| cpufreq_frequency_table entry with frequency set to CPUFREQ_TABLE_END. | ||||
| And if you want to skip one entry in the table, set the frequency to | ||||
| CPUFREQ_ENTRY_INVALID. The entries don't need to be in sorted in any | ||||
| particular order, but if they are cpufreq core will do DVFS a bit | ||||
| quickly for them as search for best match is faster. | ||||
| 
 | ||||
| By calling cpufreq_table_validate_and_show(struct cpufreq_policy *policy, | ||||
| 					struct cpufreq_frequency_table *table); | ||||
| the cpuinfo.min_freq and cpuinfo.max_freq values are detected, and | ||||
| policy->min and policy->max are set to the same values. This is | ||||
| helpful for the per-CPU initialization stage. | ||||
| By calling cpufreq_table_validate_and_show(), the cpuinfo.min_freq and | ||||
| cpuinfo.max_freq values are detected, and policy->min and policy->max | ||||
| are set to the same values. This is helpful for the per-CPU | ||||
| initialization stage. | ||||
| 
 | ||||
| int cpufreq_frequency_table_verify(struct cpufreq_policy *policy, | ||||
|                                    struct cpufreq_frequency_table *table); | ||||
| assures that at least one valid frequency is within policy->min and | ||||
| policy->max, and all other criteria are met. This is helpful for the | ||||
| ->verify call. | ||||
| cpufreq_frequency_table_verify() assures that at least one valid | ||||
| frequency is within policy->min and policy->max, and all other criteria | ||||
| are met. This is helpful for the ->verify call. | ||||
| 
 | ||||
| int cpufreq_frequency_table_target(struct cpufreq_policy *policy, | ||||
|                                    unsigned int target_freq, | ||||
|                                    unsigned int relation); | ||||
| 
 | ||||
| is the corresponding frequency table helper for the ->target | ||||
| stage. Just pass the values to this function, and this function | ||||
| returns the number of the frequency table entry which contains | ||||
| the frequency the CPU shall be set to. | ||||
| cpufreq_frequency_table_target() is the corresponding frequency table | ||||
| helper for the ->target stage. Just pass the values to this function, | ||||
| and this function returns the of the frequency table entry which | ||||
| contains the frequency the CPU shall be set to. | ||||
| 
 | ||||
| The following macros can be used as iterators over cpufreq_frequency_table: | ||||
| 
 | ||||
| cpufreq_for_each_entry(pos, table) - iterates over all entries of frequency | ||||
| table. | ||||
| 
 | ||||
| cpufreq-for_each_valid_entry(pos, table) - iterates over all entries, | ||||
| cpufreq_for_each_valid_entry(pos, table) - iterates over all entries, | ||||
| excluding CPUFREQ_ENTRY_INVALID frequencies. | ||||
| Use arguments "pos" - a cpufreq_frequency_table * as a loop cursor and | ||||
| "table" - the cpufreq_frequency_table * you want to iterate over. | ||||
|  |  | |||
|  | @ -35,9 +35,9 @@ cpufreq stats provides following statistics (explained in detail below). | |||
| -  trans_table | ||||
| 
 | ||||
| All the statistics will be from the time the stats driver has been inserted | ||||
| to the time when a read of a particular statistic is done. Obviously, stats  | ||||
| driver will not have any information about the frequency transitions before | ||||
| the stats driver insertion. | ||||
| (or the time the stats were reset) to the time when a read of a particular | ||||
| statistic is done. Obviously, stats driver will not have any information | ||||
| about the frequency transitions before the stats driver insertion. | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| <mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # ls -l | ||||
|  | @ -110,25 +110,13 @@ Config Main Menu | |||
| 		CPU Frequency scaling  ---> | ||||
| 			[*] CPU Frequency scaling | ||||
| 			[*]   CPU frequency translation statistics | ||||
| 			[*]     CPU frequency translation statistics details | ||||
| 
 | ||||
| 
 | ||||
| "CPU Frequency scaling" (CONFIG_CPU_FREQ) should be enabled to configure | ||||
| cpufreq-stats. | ||||
| 
 | ||||
| "CPU frequency translation statistics" (CONFIG_CPU_FREQ_STAT) provides the | ||||
| basic statistics which includes time_in_state and total_trans. | ||||
| statistics which includes time_in_state, total_trans and trans_table. | ||||
| 
 | ||||
| "CPU frequency translation statistics details" (CONFIG_CPU_FREQ_STAT_DETAILS) | ||||
| provides fine grained cpufreq stats by trans_table. The reason for having a | ||||
| separate config option for trans_table is: | ||||
| - trans_table goes against the traditional /sysfs rule of one value per | ||||
|   interface. It provides a whole bunch of value in a 2 dimensional matrix | ||||
|   form. | ||||
| 
 | ||||
| Once these two options are enabled and your CPU supports cpufrequency, you | ||||
| Once this option is enabled and your CPU supports cpufrequency, you | ||||
| will be able to see the CPU frequency statistics in /sysfs. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -10,6 +10,8 @@ | |||
| 
 | ||||
| 		    Dominik Brodowski  <linux@brodo.de> | ||||
|             some additions and corrections by Nico Golde <nico@ngolde.de> | ||||
| 		Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||||
| 		   Viresh Kumar <viresh.kumar@linaro.org> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | @ -28,32 +30,27 @@ Contents: | |||
| 2.3  Userspace | ||||
| 2.4  Ondemand | ||||
| 2.5  Conservative | ||||
| 2.6  Schedutil | ||||
| 
 | ||||
| 3.   The Governor Interface in the CPUfreq Core | ||||
| 
 | ||||
| 4.   References | ||||
| 
 | ||||
| 
 | ||||
| 1. What Is A CPUFreq Governor? | ||||
| ============================== | ||||
| 
 | ||||
| Most cpufreq drivers (except the intel_pstate and longrun) or even most | ||||
| cpu frequency scaling algorithms only offer the CPU to be set to one | ||||
| frequency. In order to offer dynamic frequency scaling, the cpufreq | ||||
| core must be able to tell these drivers of a "target frequency". So | ||||
| these specific drivers will be transformed to offer a "->target/target_index" | ||||
| call instead of the existing "->setpolicy" call. For "longrun", all | ||||
| stays the same, though. | ||||
| cpu frequency scaling algorithms only allow the CPU frequency to be set | ||||
| to predefined fixed values.  In order to offer dynamic frequency | ||||
| scaling, the cpufreq core must be able to tell these drivers of a | ||||
| "target frequency". So these specific drivers will be transformed to | ||||
| offer a "->target/target_index/fast_switch()" call instead of the | ||||
| "->setpolicy()" call. For set_policy drivers, all stays the same, | ||||
| though. | ||||
| 
 | ||||
| How to decide what frequency within the CPUfreq policy should be used? | ||||
| That's done using "cpufreq governors". Two are already in this patch | ||||
| -- they're the already existing "powersave" and "performance" which | ||||
| set the frequency statically to the lowest or highest frequency, | ||||
| respectively. At least two more such governors will be ready for | ||||
| addition in the near future, but likely many more as there are various | ||||
| different theories and models about dynamic frequency scaling | ||||
| around. Using such a generic interface as cpufreq offers to scaling | ||||
| governors, these can be tested extensively, and the best one can be | ||||
| selected for each specific use. | ||||
| That's done using "cpufreq governors". | ||||
| 
 | ||||
| Basically, it's the following flow graph: | ||||
| 
 | ||||
|  | @ -71,7 +68,7 @@ CPU can be set to switch independently	 |	   CPU can only be set | |||
| 		    /			       the limits of policy->{min,max} | ||||
| 		   /			            \ | ||||
| 		  /				     \ | ||||
| 	Using the ->setpolicy call,		 Using the ->target/target_index call, | ||||
| 	Using the ->setpolicy call,		 Using the ->target/target_index/fast_switch call, | ||||
| 	    the limits and the			  the frequency closest | ||||
| 	     "policy" is set.			  to target_freq is set. | ||||
| 						  It is assured that it | ||||
|  | @ -109,114 +106,159 @@ directory. | |||
| 2.4 Ondemand | ||||
| ------------ | ||||
| 
 | ||||
| The CPUfreq governor "ondemand" sets the CPU depending on the | ||||
| current usage. To do this the CPU must have the capability to | ||||
| switch the frequency very quickly.  There are a number of sysfs file | ||||
| accessible parameters: | ||||
| The CPUfreq governor "ondemand" sets the CPU frequency depending on the | ||||
| current system load. Load estimation is triggered by the scheduler | ||||
| through the update_util_data->func hook; when triggered, cpufreq checks | ||||
| the CPU-usage statistics over the last period and the governor sets the | ||||
| CPU accordingly.  The CPU must have the capability to switch the | ||||
| frequency very quickly. | ||||
| 
 | ||||
| sampling_rate: measured in uS (10^-6 seconds), this is how often you | ||||
| want the kernel to look at the CPU usage and to make decisions on | ||||
| what to do about the frequency.  Typically this is set to values of | ||||
| around '10000' or more. It's default value is (cmp. with users-guide.txt): | ||||
| transition_latency * 1000 | ||||
| Be aware that transition latency is in ns and sampling_rate is in us, so you | ||||
| get the same sysfs value by default. | ||||
| Sampling rate should always get adjusted considering the transition latency | ||||
| To set the sampling rate 750 times as high as the transition latency | ||||
| in the bash (as said, 1000 is default), do: | ||||
| echo `$(($(cat cpuinfo_transition_latency) * 750 / 1000)) \ | ||||
|     >ondemand/sampling_rate | ||||
| Sysfs files: | ||||
| 
 | ||||
| sampling_rate_min: | ||||
| The sampling rate is limited by the HW transition latency: | ||||
| transition_latency * 100 | ||||
| Or by kernel restrictions: | ||||
| If CONFIG_NO_HZ_COMMON is set, the limit is 10ms fixed. | ||||
| If CONFIG_NO_HZ_COMMON is not set or nohz=off boot parameter is used, the | ||||
| limits depend on the CONFIG_HZ option: | ||||
| HZ=1000: min=20000us  (20ms) | ||||
| HZ=250:  min=80000us  (80ms) | ||||
| HZ=100:  min=200000us (200ms) | ||||
| The highest value of kernel and HW latency restrictions is shown and | ||||
| used as the minimum sampling rate. | ||||
| * sampling_rate: | ||||
| 
 | ||||
| up_threshold: defines what the average CPU usage between the samplings | ||||
| of 'sampling_rate' needs to be for the kernel to make a decision on | ||||
| whether it should increase the frequency.  For example when it is set | ||||
| to its default value of '95' it means that between the checking | ||||
| intervals the CPU needs to be on average more than 95% in use to then | ||||
| decide that the CPU frequency needs to be increased.   | ||||
|   Measured in uS (10^-6 seconds), this is how often you want the kernel | ||||
|   to look at the CPU usage and to make decisions on what to do about the | ||||
|   frequency.  Typically this is set to values of around '10000' or more. | ||||
|   It's default value is (cmp. with users-guide.txt): transition_latency | ||||
|   * 1000.  Be aware that transition latency is in ns and sampling_rate | ||||
|   is in us, so you get the same sysfs value by default.  Sampling rate | ||||
|   should always get adjusted considering the transition latency to set | ||||
|   the sampling rate 750 times as high as the transition latency in the | ||||
|   bash (as said, 1000 is default), do: | ||||
| 
 | ||||
| ignore_nice_load: this parameter takes a value of '0' or '1'. When | ||||
| set to '0' (its default), all processes are counted towards the | ||||
| 'cpu utilisation' value.  When set to '1', the processes that are | ||||
| run with a 'nice' value will not count (and thus be ignored) in the | ||||
| overall usage calculation.  This is useful if you are running a CPU | ||||
| intensive calculation on your laptop that you do not care how long it | ||||
| takes to complete as you can 'nice' it and prevent it from taking part | ||||
| in the deciding process of whether to increase your CPU frequency. | ||||
|   $ echo `$(($(cat cpuinfo_transition_latency) * 750 / 1000)) > ondemand/sampling_rate | ||||
| 
 | ||||
| sampling_down_factor: this parameter controls the rate at which the | ||||
| kernel makes a decision on when to decrease the frequency while running | ||||
| at top speed. When set to 1 (the default) decisions to reevaluate load | ||||
| are made at the same interval regardless of current clock speed. But | ||||
| when set to greater than 1 (e.g. 100) it acts as a multiplier for the | ||||
| scheduling interval for reevaluating load when the CPU is at its top | ||||
| speed due to high load. This improves performance by reducing the overhead | ||||
| of load evaluation and helping the CPU stay at its top speed when truly | ||||
| busy, rather than shifting back and forth in speed. This tunable has no | ||||
| effect on behavior at lower speeds/lower CPU loads. | ||||
| * sampling_rate_min: | ||||
| 
 | ||||
| powersave_bias: this parameter takes a value between 0 to 1000. It | ||||
| defines the percentage (times 10) value of the target frequency that | ||||
| will be shaved off of the target. For example, when set to 100 -- 10%, | ||||
| when ondemand governor would have targeted 1000 MHz, it will target | ||||
| 1000 MHz - (10% of 1000 MHz) = 900 MHz instead. This is set to 0 | ||||
| (disabled) by default. | ||||
| When AMD frequency sensitivity powersave bias driver -- | ||||
| drivers/cpufreq/amd_freq_sensitivity.c is loaded, this parameter | ||||
| defines the workload frequency sensitivity threshold in which a lower | ||||
| frequency is chosen instead of ondemand governor's original target. | ||||
| The frequency sensitivity is a hardware reported (on AMD Family 16h | ||||
| Processors and above) value between 0 to 100% that tells software how | ||||
| the performance of the workload running on a CPU will change when | ||||
| frequency changes. A workload with sensitivity of 0% (memory/IO-bound) | ||||
| will not perform any better on higher core frequency, whereas a | ||||
| workload with sensitivity of 100% (CPU-bound) will perform better | ||||
| higher the frequency. When the driver is loaded, this is set to 400 | ||||
| by default -- for CPUs running workloads with sensitivity value below | ||||
| 40%, a lower frequency is chosen. Unloading the driver or writing 0 | ||||
| will disable this feature. | ||||
|   The sampling rate is limited by the HW transition latency: | ||||
|   transition_latency * 100 | ||||
| 
 | ||||
|   Or by kernel restrictions: | ||||
|   - If CONFIG_NO_HZ_COMMON is set, the limit is 10ms fixed. | ||||
|   - If CONFIG_NO_HZ_COMMON is not set or nohz=off boot parameter is | ||||
|     used, the limits depend on the CONFIG_HZ option: | ||||
|     HZ=1000: min=20000us  (20ms) | ||||
|     HZ=250:  min=80000us  (80ms) | ||||
|     HZ=100:  min=200000us (200ms) | ||||
| 
 | ||||
|   The highest value of kernel and HW latency restrictions is shown and | ||||
|   used as the minimum sampling rate. | ||||
| 
 | ||||
| * up_threshold: | ||||
| 
 | ||||
|   This defines what the average CPU usage between the samplings of | ||||
|   'sampling_rate' needs to be for the kernel to make a decision on | ||||
|   whether it should increase the frequency.  For example when it is set | ||||
|   to its default value of '95' it means that between the checking | ||||
|   intervals the CPU needs to be on average more than 95% in use to then | ||||
|   decide that the CPU frequency needs to be increased. | ||||
| 
 | ||||
| * ignore_nice_load: | ||||
| 
 | ||||
|   This parameter takes a value of '0' or '1'. When set to '0' (its | ||||
|   default), all processes are counted towards the 'cpu utilisation' | ||||
|   value.  When set to '1', the processes that are run with a 'nice' | ||||
|   value will not count (and thus be ignored) in the overall usage | ||||
|   calculation.  This is useful if you are running a CPU intensive | ||||
|   calculation on your laptop that you do not care how long it takes to | ||||
|   complete as you can 'nice' it and prevent it from taking part in the | ||||
|   deciding process of whether to increase your CPU frequency. | ||||
| 
 | ||||
| * sampling_down_factor: | ||||
| 
 | ||||
|   This parameter controls the rate at which the kernel makes a decision | ||||
|   on when to decrease the frequency while running at top speed. When set | ||||
|   to 1 (the default) decisions to reevaluate load are made at the same | ||||
|   interval regardless of current clock speed. But when set to greater | ||||
|   than 1 (e.g. 100) it acts as a multiplier for the scheduling interval | ||||
|   for reevaluating load when the CPU is at its top speed due to high | ||||
|   load. This improves performance by reducing the overhead of load | ||||
|   evaluation and helping the CPU stay at its top speed when truly busy, | ||||
|   rather than shifting back and forth in speed. This tunable has no | ||||
|   effect on behavior at lower speeds/lower CPU loads. | ||||
| 
 | ||||
| * powersave_bias: | ||||
| 
 | ||||
|   This parameter takes a value between 0 to 1000. It defines the | ||||
|   percentage (times 10) value of the target frequency that will be | ||||
|   shaved off of the target. For example, when set to 100 -- 10%, when | ||||
|   ondemand governor would have targeted 1000 MHz, it will target | ||||
|   1000 MHz - (10% of 1000 MHz) = 900 MHz instead. This is set to 0 | ||||
|   (disabled) by default. | ||||
| 
 | ||||
|   When AMD frequency sensitivity powersave bias driver -- | ||||
|   drivers/cpufreq/amd_freq_sensitivity.c is loaded, this parameter | ||||
|   defines the workload frequency sensitivity threshold in which a lower | ||||
|   frequency is chosen instead of ondemand governor's original target. | ||||
|   The frequency sensitivity is a hardware reported (on AMD Family 16h | ||||
|   Processors and above) value between 0 to 100% that tells software how | ||||
|   the performance of the workload running on a CPU will change when | ||||
|   frequency changes. A workload with sensitivity of 0% (memory/IO-bound) | ||||
|   will not perform any better on higher core frequency, whereas a | ||||
|   workload with sensitivity of 100% (CPU-bound) will perform better | ||||
|   higher the frequency. When the driver is loaded, this is set to 400 by | ||||
|   default -- for CPUs running workloads with sensitivity value below | ||||
|   40%, a lower frequency is chosen. Unloading the driver or writing 0 | ||||
|   will disable this feature. | ||||
| 
 | ||||
| 
 | ||||
| 2.5 Conservative | ||||
| ---------------- | ||||
| 
 | ||||
| The CPUfreq governor "conservative", much like the "ondemand" | ||||
| governor, sets the CPU depending on the current usage.  It differs in | ||||
| behaviour in that it gracefully increases and decreases the CPU speed | ||||
| rather than jumping to max speed the moment there is any load on the | ||||
| CPU.  This behaviour more suitable in a battery powered environment. | ||||
| The governor is tweaked in the same manner as the "ondemand" governor | ||||
| through sysfs with the addition of: | ||||
| governor, sets the CPU frequency depending on the current usage.  It | ||||
| differs in behaviour in that it gracefully increases and decreases the | ||||
| CPU speed rather than jumping to max speed the moment there is any load | ||||
| on the CPU. This behaviour is more suitable in a battery powered | ||||
| environment.  The governor is tweaked in the same manner as the | ||||
| "ondemand" governor through sysfs with the addition of: | ||||
| 
 | ||||
| freq_step: this describes what percentage steps the cpu freq should be | ||||
| increased and decreased smoothly by.  By default the cpu frequency will | ||||
| increase in 5% chunks of your maximum cpu frequency.  You can change this | ||||
| value to anywhere between 0 and 100 where '0' will effectively lock your | ||||
| CPU at a speed regardless of its load whilst '100' will, in theory, make | ||||
| it behave identically to the "ondemand" governor. | ||||
| * freq_step: | ||||
| 
 | ||||
| down_threshold: same as the 'up_threshold' found for the "ondemand" | ||||
| governor but for the opposite direction.  For example when set to its | ||||
| default value of '20' it means that if the CPU usage needs to be below | ||||
| 20% between samples to have the frequency decreased. | ||||
|   This describes what percentage steps the cpu freq should be increased | ||||
|   and decreased smoothly by.  By default the cpu frequency will increase | ||||
|   in 5% chunks of your maximum cpu frequency.  You can change this value | ||||
|   to anywhere between 0 and 100 where '0' will effectively lock your CPU | ||||
|   at a speed regardless of its load whilst '100' will, in theory, make | ||||
|   it behave identically to the "ondemand" governor. | ||||
| 
 | ||||
| * down_threshold: | ||||
| 
 | ||||
|   Same as the 'up_threshold' found for the "ondemand" governor but for | ||||
|   the opposite direction.  For example when set to its default value of | ||||
|   '20' it means that if the CPU usage needs to be below 20% between | ||||
|   samples to have the frequency decreased. | ||||
| 
 | ||||
| * sampling_down_factor: | ||||
| 
 | ||||
|   Similar functionality as in "ondemand" governor.  But in | ||||
|   "conservative", it controls the rate at which the kernel makes a | ||||
|   decision on when to decrease the frequency while running in any speed. | ||||
|   Load for frequency increase is still evaluated every sampling rate. | ||||
| 
 | ||||
| 
 | ||||
| 2.6 Schedutil | ||||
| ------------- | ||||
| 
 | ||||
| The "schedutil" governor aims at better integration with the Linux | ||||
| kernel scheduler.  Load estimation is achieved through the scheduler's | ||||
| Per-Entity Load Tracking (PELT) mechanism, which also provides | ||||
| information about the recent load [1].  This governor currently does | ||||
| load based DVFS only for tasks managed by CFS. RT and DL scheduler tasks | ||||
| are always run at the highest frequency.  Unlike all the other | ||||
| governors, the code is located under the kernel/sched/ directory. | ||||
| 
 | ||||
| Sysfs files: | ||||
| 
 | ||||
| * rate_limit_us: | ||||
| 
 | ||||
|   This contains a value in microseconds. The governor waits for | ||||
|   rate_limit_us time before reevaluating the load again, after it has | ||||
|   evaluated the load once. | ||||
| 
 | ||||
| For an in-depth comparison with the other governors refer to [2]. | ||||
| 
 | ||||
| sampling_down_factor: similar functionality as in "ondemand" governor. | ||||
| But in "conservative", it controls the rate at which the kernel makes | ||||
| a decision on when to decrease the frequency while running in any | ||||
| speed. Load for frequency increase is still evaluated every | ||||
| sampling rate. | ||||
| 
 | ||||
| 3. The Governor Interface in the CPUfreq Core | ||||
| ============================================= | ||||
|  | @ -225,26 +267,10 @@ A new governor must register itself with the CPUfreq core using | |||
| "cpufreq_register_governor". The struct cpufreq_governor, which has to | ||||
| be passed to that function, must contain the following values: | ||||
| 
 | ||||
| governor->name -	    A unique name for this governor | ||||
| governor->governor -	    The governor callback function | ||||
| governor->owner	-	    .THIS_MODULE for the governor module (if  | ||||
| 			    appropriate) | ||||
| 
 | ||||
| The governor->governor callback is called with the current (or to-be-set) | ||||
| cpufreq_policy struct for that CPU, and an unsigned int event. The | ||||
| following events are currently defined: | ||||
| 
 | ||||
| CPUFREQ_GOV_START:   This governor shall start its duty for the CPU | ||||
| 		     policy->cpu | ||||
| CPUFREQ_GOV_STOP:    This governor shall end its duty for the CPU | ||||
| 		     policy->cpu | ||||
| CPUFREQ_GOV_LIMITS:  The limits for CPU policy->cpu have changed to | ||||
| 		     policy->min and policy->max. | ||||
| 
 | ||||
| If you need other "events" externally of your driver, _only_ use the | ||||
| cpufreq_governor_l(unsigned int cpu, unsigned int event) call to the | ||||
| CPUfreq core to ensure proper locking. | ||||
| governor->name - A unique name for this governor. | ||||
| governor->owner - .THIS_MODULE for the governor module (if appropriate). | ||||
| 
 | ||||
| plus a set of hooks to the functions implementing the governor's logic. | ||||
| 
 | ||||
| The CPUfreq governor may call the CPU processor driver using one of | ||||
| these two functions: | ||||
|  | @ -258,12 +284,18 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, | |||
|                                    unsigned int relation); | ||||
| 
 | ||||
| target_freq must be within policy->min and policy->max, of course. | ||||
| What's the difference between these two functions? When your governor | ||||
| still is in a direct code path of a call to governor->governor, the | ||||
| per-CPU cpufreq lock is still held in the cpufreq core, and there's | ||||
| no need to lock it again (in fact, this would cause a deadlock). So | ||||
| use __cpufreq_driver_target only in these cases. In all other cases  | ||||
| (for example, when there's a "daemonized" function that wakes up  | ||||
| every second), use cpufreq_driver_target to lock the cpufreq per-CPU | ||||
| lock before the command is passed to the cpufreq processor driver. | ||||
| What's the difference between these two functions? When your governor is | ||||
| in a direct code path of a call to governor callbacks, like | ||||
| governor->start(), the policy->rwsem is still held in the cpufreq core, | ||||
| and there's no need to lock it again (in fact, this would cause a | ||||
| deadlock). So use __cpufreq_driver_target only in these cases. In all | ||||
| other cases (for example, when there's a "daemonized" function that | ||||
| wakes up every second), use cpufreq_driver_target to take policy->rwsem | ||||
| before the command is passed to the cpufreq driver. | ||||
| 
 | ||||
| 4. References | ||||
| ============= | ||||
| 
 | ||||
| [1] Per-entity load tracking: https://lwn.net/Articles/531853/ | ||||
| [2] Improvements in CPU frequency management: https://lwn.net/Articles/682391/ | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,16 +18,29 @@ | |||
| 
 | ||||
| Documents in this directory: | ||||
| ---------------------------- | ||||
| core.txt	-	General description of the CPUFreq core and | ||||
| 			of CPUFreq notifiers | ||||
| 
 | ||||
| cpu-drivers.txt -	How to implement a new cpufreq processor driver | ||||
| amd-powernow.txt -	AMD powernow driver specific file. | ||||
| 
 | ||||
| boost.txt -		Frequency boosting support. | ||||
| 
 | ||||
| core.txt	-	General description of the CPUFreq core and | ||||
| 			of CPUFreq notifiers. | ||||
| 
 | ||||
| cpu-drivers.txt -	How to implement a new cpufreq processor driver. | ||||
| 
 | ||||
| cpufreq-nforce2.txt -	nVidia nForce2 platform specific file. | ||||
| 
 | ||||
| cpufreq-stats.txt -	General description of sysfs cpufreq stats. | ||||
| 
 | ||||
| governors.txt	-	What are cpufreq governors and how to | ||||
| 			implement them? | ||||
| 
 | ||||
| index.txt	-	File index, Mailing list and Links (this document) | ||||
| 
 | ||||
| intel-pstate.txt -	Intel pstate cpufreq driver specific file. | ||||
| 
 | ||||
| pcc-cpufreq.txt -	PCC cpufreq driver specific file. | ||||
| 
 | ||||
| user-guide.txt	-	User Guide to CPUFreq | ||||
| 
 | ||||
| 
 | ||||
|  | @ -35,9 +48,7 @@ Mailing List | |||
| ------------ | ||||
| There is a CPU frequency changing CVS commit and general list where | ||||
| you can report bugs, problems or submit patches. To post a message, | ||||
| send an email to linux-pm@vger.kernel.org, to subscribe go to | ||||
| http://vger.kernel.org/vger-lists.html#linux-pm and follow the | ||||
| instructions there. | ||||
| send an email to linux-pm@vger.kernel.org. | ||||
| 
 | ||||
| Links | ||||
| ----- | ||||
|  | @ -48,7 +59,7 @@ how to access the CVS repository: | |||
| * http://cvs.arm.linux.org.uk/ | ||||
| 
 | ||||
| the CPUFreq Mailing list: | ||||
| * http://vger.kernel.org/vger-lists.html#cpufreq | ||||
| * http://vger.kernel.org/vger-lists.html#linux-pm | ||||
| 
 | ||||
| Clock and voltage scaling for the SA-1100: | ||||
| * http://www.lartmaker.nl/projects/scaling | ||||
|  |  | |||
|  | @ -85,6 +85,21 @@ Sysfs will show : | |||
| Refer to "Intel® 64 and IA-32 Architectures Software Developer’s Manual | ||||
| Volume 3: System Programming Guide" to understand ratios. | ||||
| 
 | ||||
| There is one more sysfs attribute in /sys/devices/system/cpu/intel_pstate/ | ||||
| that can be used for controlling the operation mode of the driver: | ||||
| 
 | ||||
|       status: Three settings are possible: | ||||
|       "off"     - The driver is not in use at this time. | ||||
|       "active"  - The driver works as a P-state governor (default). | ||||
|       "passive" - The driver works as a regular cpufreq one and collaborates | ||||
|                   with the generic cpufreq governors (it sets P-states as | ||||
|                   requested by those governors). | ||||
|       The current setting is returned by reads from this attribute.  Writing one | ||||
|       of the above strings to it changes the operation mode as indicated by that | ||||
|       string, if possible.  If HW-managed P-states (HWP) are enabled, it is not | ||||
|       possible to change the driver's operation mode and attempts to write to | ||||
|       this attribute will fail. | ||||
| 
 | ||||
| cpufreq sysfs for Intel P-State | ||||
| 
 | ||||
| Since this driver registers with cpufreq, cpufreq sysfs is also presented. | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ | |||
| Contents: | ||||
| --------- | ||||
| 1. Supported Architectures and Processors | ||||
| 1.1 ARM | ||||
| 1.1 ARM and ARM64 | ||||
| 1.2 x86 | ||||
| 1.3 sparc64 | ||||
| 1.4 ppc | ||||
|  | @ -37,16 +37,10 @@ Contents: | |||
| 1. Supported Architectures and Processors | ||||
| ========================================= | ||||
| 
 | ||||
| 1.1 ARM | ||||
| ------- | ||||
| 
 | ||||
| The following ARM processors are supported by cpufreq: | ||||
| 
 | ||||
| ARM Integrator | ||||
| ARM-SA1100 | ||||
| ARM-SA1110 | ||||
| Intel PXA | ||||
| 1.1 ARM and ARM64 | ||||
| ----------------- | ||||
| 
 | ||||
| Almost all ARM and ARM64 platforms support CPU frequency scaling. | ||||
| 
 | ||||
| 1.2 x86 | ||||
| ------- | ||||
|  | @ -69,6 +63,7 @@ Transmeta Crusoe | |||
| Transmeta Efficeon | ||||
| VIA Cyrix 3 / C3 | ||||
| various processors on some ACPI 2.0-compatible systems [*] | ||||
| And many more | ||||
| 
 | ||||
| [*] Only if "ACPI Processor Performance States" are available | ||||
| to the ACPI<->BIOS interface. | ||||
|  | @ -147,10 +142,19 @@ mounted it at /sys, the cpufreq interface is located in a subdirectory | |||
| "cpufreq" within the cpu-device directory | ||||
| (e.g. /sys/devices/system/cpu/cpu0/cpufreq/ for the first CPU). | ||||
| 
 | ||||
| affected_cpus :			List of Online CPUs that require software | ||||
| 				coordination of frequency. | ||||
| 
 | ||||
| cpuinfo_cur_freq :		Current frequency of the CPU as obtained from | ||||
| 				the hardware, in KHz. This is the frequency | ||||
| 				the CPU actually runs at. | ||||
| 
 | ||||
| cpuinfo_min_freq :		this file shows the minimum operating | ||||
| 				frequency the processor can run at(in kHz)  | ||||
| 
 | ||||
| cpuinfo_max_freq :		this file shows the maximum operating | ||||
| 				frequency the processor can run at(in kHz)  | ||||
| 
 | ||||
| cpuinfo_transition_latency	The time it takes on this CPU to | ||||
| 				switch between two frequencies in nano | ||||
| 				seconds. If unknown or known to be | ||||
|  | @ -163,25 +167,30 @@ cpuinfo_transition_latency	The time it takes on this CPU to | |||
| 				userspace daemon. Make sure to not | ||||
| 				switch the frequency too often | ||||
| 				resulting in performance loss. | ||||
| scaling_driver :		this file shows what cpufreq driver is | ||||
| 				used to set the frequency on this CPU | ||||
| 
 | ||||
| related_cpus :			List of Online + Offline CPUs that need software | ||||
| 				coordination of frequency. | ||||
| 
 | ||||
| scaling_available_frequencies : List of available frequencies, in KHz. | ||||
| 
 | ||||
| scaling_available_governors :	this file shows the CPUfreq governors | ||||
| 				available in this kernel. You can see the | ||||
| 				currently activated governor in | ||||
| 
 | ||||
| scaling_cur_freq :		Current frequency of the CPU as determined by | ||||
| 				the governor and cpufreq core, in KHz. This is | ||||
| 				the frequency the kernel thinks the CPU runs | ||||
| 				at. | ||||
| 
 | ||||
| scaling_driver :		this file shows what cpufreq driver is | ||||
| 				used to set the frequency on this CPU | ||||
| 
 | ||||
| scaling_governor,		and by "echoing" the name of another | ||||
| 				governor you can change it. Please note | ||||
| 				that some governors won't load - they only | ||||
| 				work on some specific architectures or | ||||
| 				processors. | ||||
| 
 | ||||
| cpuinfo_cur_freq :		Current frequency of the CPU as obtained from | ||||
| 				the hardware, in KHz. This is the frequency | ||||
| 				the CPU actually runs at. | ||||
| 
 | ||||
| scaling_available_frequencies : List of available frequencies, in KHz. | ||||
| 
 | ||||
| scaling_min_freq and | ||||
| scaling_max_freq		show the current "policy limits" (in | ||||
| 				kHz). By echoing new values into these | ||||
|  | @ -190,16 +199,11 @@ scaling_max_freq		show the current "policy limits" (in | |||
| 				first set scaling_max_freq, then | ||||
| 				scaling_min_freq. | ||||
| 
 | ||||
| affected_cpus :			List of Online CPUs that require software | ||||
| 				coordination of frequency. | ||||
| 
 | ||||
| related_cpus :			List of Online + Offline CPUs that need software | ||||
| 				coordination of frequency. | ||||
| 
 | ||||
| scaling_cur_freq :		Current frequency of the CPU as determined by | ||||
| 				the governor and cpufreq core, in KHz. This is | ||||
| 				the frequency the kernel thinks the CPU runs | ||||
| 				at. | ||||
| scaling_setspeed		This can be read to get the currently programmed | ||||
| 				value by the governor. This can be written to | ||||
| 				change the current frequency for a group of | ||||
| 				CPUs, represented by a policy. This is supported | ||||
| 				currently only by the userspace governor. | ||||
| 
 | ||||
| bios_limit :			If the BIOS tells the OS to limit a CPU to | ||||
| 				lower frequencies, the user can read out the | ||||
|  |  | |||
|  | @ -207,6 +207,10 @@ Optional feature arguments are: | |||
| 		   block, then the cache block is invalidated. | ||||
| 		   To enable passthrough mode the cache must be clean. | ||||
| 
 | ||||
|    metadata2	: use version 2 of the metadata.  This stores the dirty bits | ||||
|                   in a separate btree, which improves speed of shutting | ||||
| 		  down the cache. | ||||
| 
 | ||||
| A policy called 'default' is always registered.  This is an alias for | ||||
| the policy we currently think is giving best all round performance. | ||||
| 
 | ||||
|  |  | |||
|  | @ -161,6 +161,15 @@ The target is named "raid" and it accepts the following parameters: | |||
| 		the RAID type (i.e. the allocation algorithm) as well, e.g. | ||||
| 		changing from raid5_ls to raid5_n. | ||||
| 
 | ||||
| 	[journal_dev <dev>] | ||||
| 		This option adds a journal device to raid4/5/6 raid sets and | ||||
| 		uses it to close the 'write hole' caused by the non-atomic updates | ||||
| 		to the component devices which can cause data loss during recovery. | ||||
| 		The journal device is used as writethrough thus causing writes to | ||||
| 		be throttled versus non-journaled raid4/5/6 sets. | ||||
| 		Takeover/reshape is not possible with a raid4/5/6 journal device; | ||||
| 		it has to be deconfigured before requesting these. | ||||
| 
 | ||||
| <#raid_devs>: The number of devices composing the array. | ||||
| 	Each device consists of two entries.  The first is the device | ||||
| 	containing the metadata (if any); the second is the one containing the | ||||
|  | @ -245,6 +254,9 @@ recovery.  Here is a fuller description of the individual fields: | |||
| 	<data_offset>   The current data offset to the start of the user data on | ||||
| 			each component device of a raid set (see the respective | ||||
| 			raid parameter to support out-of-place reshaping). | ||||
| 	<journal_char>	'A' - active raid4/5/6 journal device. | ||||
| 			'D' - dead journal device. | ||||
| 			'-' - no journal device. | ||||
| 
 | ||||
| 
 | ||||
| Message Interface | ||||
|  | @ -314,3 +326,8 @@ Version History | |||
| 1.9.0   Add support for RAID level takeover/reshape/region size | ||||
| 	and set size reduction. | ||||
| 1.9.1   Fix activation of existing RAID 4/10 mapped devices | ||||
| 1.9.2   Don't emit '- -' on the status table line in case the constructor | ||||
| 	fails reading a superblock. Correctly emit 'maj:min1 maj:min2' and | ||||
| 	'D' on the status line.  If '- -' is passed into the constructor, emit | ||||
| 	'- -' on the table line and '-' as the status line health character. | ||||
| 1.10.0  Add support for raid4/5/6 journal device | ||||
|  |  | |||
							
								
								
									
										128
									
								
								Documentation/devicetree/bindings/cpufreq/ti-cpufreq.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								Documentation/devicetree/bindings/cpufreq/ti-cpufreq.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,128 @@ | |||
| TI CPUFreq and OPP bindings | ||||
| ================================ | ||||
| 
 | ||||
| Certain TI SoCs, like those in the am335x, am437x, am57xx, and dra7xx | ||||
| families support different OPPs depending on the silicon variant in use. | ||||
| The ti-cpufreq driver can use revision and an efuse value from the SoC to | ||||
| provide the OPP framework with supported hardware information. This is | ||||
| used to determine which OPPs from the operating-points-v2 table get enabled | ||||
| when it is parsed by the OPP framework. | ||||
| 
 | ||||
| Required properties: | ||||
| -------------------- | ||||
| In 'cpus' nodes: | ||||
| - operating-points-v2: Phandle to the operating-points-v2 table to use. | ||||
| 
 | ||||
| In 'operating-points-v2' table: | ||||
| - compatible: Should be | ||||
| 	- 'operating-points-v2-ti-cpu' for am335x, am43xx, and dra7xx/am57xx SoCs | ||||
| - syscon: A phandle pointing to a syscon node representing the control module | ||||
| 	  register space of the SoC. | ||||
| 
 | ||||
| Optional properties: | ||||
| -------------------- | ||||
| For each opp entry in 'operating-points-v2' table: | ||||
| - opp-supported-hw: Two bitfields indicating: | ||||
| 	1. Which revision of the SoC the OPP is supported by | ||||
| 	2. Which eFuse bits indicate this OPP is available | ||||
| 
 | ||||
| 	A bitwise AND is performed against these values and if any bit | ||||
| 	matches, the OPP gets enabled. | ||||
| 
 | ||||
| Example: | ||||
| -------- | ||||
| 
 | ||||
| /* From arch/arm/boot/dts/am33xx.dtsi */ | ||||
| cpus { | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <0>; | ||||
| 	cpu@0 { | ||||
| 		compatible = "arm,cortex-a8"; | ||||
| 		device_type = "cpu"; | ||||
| 		reg = <0>; | ||||
| 
 | ||||
| 		operating-points-v2 = <&cpu0_opp_table>; | ||||
| 
 | ||||
| 		clocks = <&dpll_mpu_ck>; | ||||
| 		clock-names = "cpu"; | ||||
| 
 | ||||
| 		clock-latency = <300000>; /* From omap-cpufreq driver */ | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| /* | ||||
|  * cpu0 has different OPPs depending on SoC revision and some on revisions | ||||
|  * 0x2 and 0x4 have eFuse bits that indicate if they are available or not | ||||
|  */ | ||||
| cpu0_opp_table: opp-table { | ||||
| 	compatible = "operating-points-v2-ti-cpu"; | ||||
| 	syscon = <&scm_conf>; | ||||
| 
 | ||||
| 	/* | ||||
| 	 * The three following nodes are marked with opp-suspend | ||||
| 	 * because they can not be enabled simultaneously on a | ||||
| 	 * single SoC. | ||||
| 	 */ | ||||
| 	opp50@300000000 { | ||||
| 		opp-hz = /bits/ 64 <300000000>; | ||||
| 		opp-microvolt = <950000 931000 969000>; | ||||
| 		opp-supported-hw = <0x06 0x0010>; | ||||
| 		opp-suspend; | ||||
| 	}; | ||||
| 
 | ||||
| 	opp100@275000000 { | ||||
| 		opp-hz = /bits/ 64 <275000000>; | ||||
| 		opp-microvolt = <1100000 1078000 1122000>; | ||||
| 		opp-supported-hw = <0x01 0x00FF>; | ||||
| 		opp-suspend; | ||||
| 	}; | ||||
| 
 | ||||
| 	opp100@300000000 { | ||||
| 		opp-hz = /bits/ 64 <300000000>; | ||||
| 		opp-microvolt = <1100000 1078000 1122000>; | ||||
| 		opp-supported-hw = <0x06 0x0020>; | ||||
| 		opp-suspend; | ||||
| 	}; | ||||
| 
 | ||||
| 	opp100@500000000 { | ||||
| 		opp-hz = /bits/ 64 <500000000>; | ||||
| 		opp-microvolt = <1100000 1078000 1122000>; | ||||
| 		opp-supported-hw = <0x01 0xFFFF>; | ||||
| 	}; | ||||
| 
 | ||||
| 	opp100@600000000 { | ||||
| 		opp-hz = /bits/ 64 <600000000>; | ||||
| 		opp-microvolt = <1100000 1078000 1122000>; | ||||
| 		opp-supported-hw = <0x06 0x0040>; | ||||
| 	}; | ||||
| 
 | ||||
| 	opp120@600000000 { | ||||
| 		opp-hz = /bits/ 64 <600000000>; | ||||
| 		opp-microvolt = <1200000 1176000 1224000>; | ||||
| 		opp-supported-hw = <0x01 0xFFFF>; | ||||
| 	}; | ||||
| 
 | ||||
| 	opp120@720000000 { | ||||
| 		opp-hz = /bits/ 64 <720000000>; | ||||
| 		opp-microvolt = <1200000 1176000 1224000>; | ||||
| 		opp-supported-hw = <0x06 0x0080>; | ||||
| 	}; | ||||
| 
 | ||||
| 	oppturbo@720000000 { | ||||
| 		opp-hz = /bits/ 64 <720000000>; | ||||
| 		opp-microvolt = <1260000 1234800 1285200>; | ||||
| 		opp-supported-hw = <0x01 0xFFFF>; | ||||
| 	}; | ||||
| 
 | ||||
| 	oppturbo@800000000 { | ||||
| 		opp-hz = /bits/ 64 <800000000>; | ||||
| 		opp-microvolt = <1260000 1234800 1285200>; | ||||
| 		opp-supported-hw = <0x06 0x0100>; | ||||
| 	}; | ||||
| 
 | ||||
| 	oppnitro@1000000000 { | ||||
| 		opp-hz = /bits/ 64 <1000000000>; | ||||
| 		opp-microvolt = <1325000 1298500 1351500>; | ||||
| 		opp-supported-hw = <0x04 0x0200>; | ||||
| 	}; | ||||
| }; | ||||
|  | @ -123,6 +123,20 @@ Detailed correlation between sub-blocks and power line according to Exynos SoC: | |||
| 		|--- FSYS | ||||
| 		|--- FSYS2 | ||||
| 
 | ||||
| - In case of Exynos5433, there is VDD_INT power line as following: | ||||
| 	VDD_INT |--- G2D (parent device) | ||||
| 		|--- MSCL | ||||
| 		|--- GSCL | ||||
| 		|--- JPEG | ||||
| 		|--- MFC | ||||
| 		|--- HEVC | ||||
| 		|--- BUS0 | ||||
| 		|--- BUS1 | ||||
| 		|--- BUS2 | ||||
| 		|--- PERIS (Fixed clock rate) | ||||
| 		|--- PERIC (Fixed clock rate) | ||||
| 		|--- FSYS  (Fixed clock rate) | ||||
| 
 | ||||
| Example1: | ||||
| 	Show the AXI buses of Exynos3250 SoC. Exynos3250 divides the buses to | ||||
| 	power line (regulator). The MIF (Memory Interface) AXI bus is used to | ||||
|  |  | |||
|  | @ -40,8 +40,7 @@ Example: | |||
| 
 | ||||
| DMA clients connected to the STM32 DMA controller must use the format | ||||
| described in the dma.txt file, using a five-cell specifier for each | ||||
| channel: a phandle plus four integer cells. | ||||
| The four cells in order are: | ||||
| channel: a phandle to the DMA controller plus the following four integer cells: | ||||
| 
 | ||||
| 1. The channel id | ||||
| 2. The request line number | ||||
|  | @ -61,7 +60,7 @@ The four cells in order are: | |||
| 	0x1: medium | ||||
| 	0x2: high | ||||
| 	0x3: very high | ||||
| 5. A 32bit mask specifying the DMA FIFO threshold configuration which are device | ||||
| 4. A 32bit mask specifying the DMA FIFO threshold configuration which are device | ||||
|    dependent: | ||||
|  -bit 0-1: Fifo threshold | ||||
| 	0x0: 1/4 full FIFO | ||||
|  |  | |||
|  | @ -17,6 +17,22 @@ Required properties: | |||
| - interrupt-parent: the phandle for the interrupt controller | ||||
| - interrupts: interrupt line | ||||
| 
 | ||||
| Additional optional properties: | ||||
| 
 | ||||
| Some devices may support additional optional properties to help with, e.g., | ||||
| power sequencing. The following properties can be supported by one or more | ||||
| device-specific compatible properties, which should be used in addition to the | ||||
| "hid-over-i2c" string. | ||||
| 
 | ||||
| - compatible: | ||||
|   * "wacom,w9013" (Wacom W9013 digitizer). Supports: | ||||
|     - vdd-supply | ||||
|     - post-power-on-delay-ms | ||||
| 
 | ||||
| - vdd-supply: phandle of the regulator that provides the supply voltage. | ||||
| - post-power-on-delay-ms: time required by the device after enabling its regulators | ||||
|   before it is ready for communication. Must be used with 'vdd-supply'. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 	i2c-hid-dev@2c { | ||||
|  |  | |||
|  | @ -61,16 +61,24 @@ property can be omitted. | |||
| 
 | ||||
| Examples: | ||||
| 
 | ||||
| system-status { | ||||
| 	label = "Status"; | ||||
| 	linux,default-trigger = "heartbeat"; | ||||
| 	... | ||||
| gpio-leds { | ||||
| 	compatible = "gpio-leds"; | ||||
| 
 | ||||
| 	system-status { | ||||
| 		label = "Status"; | ||||
| 		linux,default-trigger = "heartbeat"; | ||||
| 		gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| camera-flash { | ||||
| 	label = "Flash"; | ||||
| 	led-sources = <0>, <1>; | ||||
| 	led-max-microamp = <50000>; | ||||
| 	flash-max-microamp = <320000>; | ||||
| 	flash-max-timeout-us = <500000>; | ||||
| max77693-led { | ||||
| 	compatible = "maxim,max77693-led"; | ||||
| 
 | ||||
| 	camera-flash { | ||||
| 		label = "Flash"; | ||||
| 		led-sources = <0>, <1>; | ||||
| 		led-max-microamp = <50000>; | ||||
| 		flash-max-microamp = <320000>; | ||||
| 		flash-max-timeout-us = <500000>; | ||||
| 	}; | ||||
| }; | ||||
|  |  | |||
							
								
								
									
										29
									
								
								Documentation/devicetree/bindings/leds/irled/spi-ir-led.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								Documentation/devicetree/bindings/leds/irled/spi-ir-led.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| Device tree bindings for IR LED connected through SPI bus which is used as | ||||
| remote controller. | ||||
| 
 | ||||
| The IR LED switch is connected to the MOSI line of the SPI device and the data | ||||
| are delivered thourgh that. | ||||
| 
 | ||||
| Required properties: | ||||
| 	- compatible: should be "ir-spi-led". | ||||
| 
 | ||||
| Optional properties: | ||||
| 	- duty-cycle: 8 bit balue that represents the percentage of one period | ||||
| 	  in which the signal is active.  It can be 50, 60, 70, 75, 80 or 90. | ||||
| 	- led-active-low: boolean value that specifies whether the output is | ||||
| 	  negated with a NOT gate. | ||||
| 	- power-supply: specifies the power source. It can either be a regulator | ||||
| 	  or a gpio which enables a regulator, i.e. a regulator-fixed as | ||||
| 	  described in | ||||
| 	  Documentation/devicetree/bindings/regulator/fixed-regulator.txt | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 	irled@0 { | ||||
| 		compatible = "ir-spi-led"; | ||||
| 		reg = <0x0>; | ||||
| 		spi-max-frequency = <5000000>; | ||||
| 		power-supply = <&vdd_led>; | ||||
| 		led-active-low; | ||||
| 		duty-cycle = /bits/ 8 <60>; | ||||
| 	}; | ||||
							
								
								
									
										21
									
								
								Documentation/devicetree/bindings/media/fsl-vdoa.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								Documentation/devicetree/bindings/media/fsl-vdoa.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| Freescale Video Data Order Adapter | ||||
| ================================== | ||||
| 
 | ||||
| The Video Data Order Adapter (VDOA) is present on the i.MX6q. Its sole purpose | ||||
| is to reorder video data from the macroblock tiled order produced by the CODA | ||||
| 960 VPU to the conventional raster-scan order for scanout. | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible: must be "fsl,imx6q-vdoa" | ||||
| - reg: the register base and size for the device registers | ||||
| - interrupts: the VDOA interrupt | ||||
| - clocks: the vdoa clock | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| vdoa@21e4000 { | ||||
|         compatible = "fsl,imx6q-vdoa"; | ||||
|         reg = <0x021e4000 0x4000>; | ||||
|         interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>; | ||||
|         clocks = <&clks IMX6QDL_CLK_VDOA>; | ||||
| }; | ||||
|  | @ -5,7 +5,8 @@ Required properties: | |||
| 	- gpios: specifies GPIO used for IR signal reception. | ||||
| 
 | ||||
| Optional properties: | ||||
| 	- linux,rc-map-name: Linux specific remote control map name. | ||||
| 	- linux,rc-map-name: see rc.txt file in the same | ||||
| 	  directory. | ||||
| 
 | ||||
| Example node: | ||||
| 
 | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ Required properties: | |||
| 	- clocks: clock phandle and specifier pair. | ||||
| 
 | ||||
| Optional properties: | ||||
| 	- linux,rc-map-name : Remote control map name. | ||||
| 	- linux,rc-map-name: see rc.txt file in the same directory. | ||||
| 	- hisilicon,power-syscon: DEPRECATED. Don't use this in new dts files. | ||||
| 		Provide correct clocks instead. | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,48 @@ | |||
| Toshiba et8ek8 5MP sensor | ||||
| 
 | ||||
| Toshiba et8ek8 5MP sensor is an image sensor found in Nokia N900 device | ||||
| 
 | ||||
| More detailed documentation can be found in | ||||
| Documentation/devicetree/bindings/media/video-interfaces.txt . | ||||
| 
 | ||||
| 
 | ||||
| Mandatory properties | ||||
| -------------------- | ||||
| 
 | ||||
| - compatible: "toshiba,et8ek8" | ||||
| - reg: I2C address (0x3e, or an alternative address) | ||||
| - vana-supply: Analogue voltage supply (VANA), 2.8 volts | ||||
| - clocks: External clock to the sensor | ||||
| - clock-frequency: Frequency of the external clock to the sensor. Camera | ||||
|   driver will set this frequency on the external clock. The clock frequency is | ||||
|   a pre-determined frequency known to be suitable to the board. | ||||
| - reset-gpios: XSHUTDOWN GPIO. The XSHUTDOWN signal is active low. The sensor | ||||
|   is in hardware standby mode when the signal is in the low state. | ||||
| 
 | ||||
| 
 | ||||
| Endpoint node mandatory properties | ||||
| ---------------------------------- | ||||
| 
 | ||||
| - remote-endpoint: A phandle to the bus receiver's endpoint node. | ||||
| 
 | ||||
| 
 | ||||
| Example | ||||
| ------- | ||||
| 
 | ||||
| &i2c3 { | ||||
| 	clock-frequency = <400000>; | ||||
| 
 | ||||
| 	cam1: camera@3e { | ||||
| 		compatible = "toshiba,et8ek8"; | ||||
| 		reg = <0x3e>; | ||||
| 		vana-supply = <&vaux4>; | ||||
| 		clocks = <&isp 0>; | ||||
| 		clock-frequency = <9600000>; | ||||
| 		reset-gpio = <&gpio4 6 GPIO_ACTIVE_HIGH>; /* 102 */ | ||||
| 		port { | ||||
| 			csi_cam1: endpoint { | ||||
| 				remote-endpoint = <&csi_out1>; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | @ -8,6 +8,9 @@ Required properties: | |||
|  - reg		: physical base address and length of the device registers | ||||
|  - interrupts	: a single specifier for the interrupt from the device | ||||
| 
 | ||||
| Optional properties: | ||||
|  - linux,rc-map-name:	see rc.txt file in the same directory. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 	ir-receiver@c8100480 { | ||||
|  |  | |||
							
								
								
									
										24
									
								
								Documentation/devicetree/bindings/media/mtk-cir.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								Documentation/devicetree/bindings/media/mtk-cir.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| Device-Tree bindings for Mediatek consumer IR controller | ||||
| found in Mediatek SoC family | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible	    : "mediatek,mt7623-cir" | ||||
| - clocks	    : list of clock specifiers, corresponding to | ||||
| 		      entries in clock-names property; | ||||
| - clock-names	    : should contain "clk" entries; | ||||
| - interrupts	    : should contain IR IRQ number; | ||||
| - reg		    : should contain IO map address for IR. | ||||
| 
 | ||||
| Optional properties: | ||||
| - linux,rc-map-name : see rc.txt file in the same directory. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| cir: cir@10013000 { | ||||
| 	compatible = "mediatek,mt7623-cir"; | ||||
| 	reg = <0 0x10013000 0 0x1000>; | ||||
| 	interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_LOW>; | ||||
| 	clocks = <&infracfg CLK_INFRA_IRRX>; | ||||
| 	clock-names = "clk"; | ||||
| 	linux,rc-map-name = "rc-rc6-mce"; | ||||
| }; | ||||
							
								
								
									
										117
									
								
								Documentation/devicetree/bindings/media/rc.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								Documentation/devicetree/bindings/media/rc.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,117 @@ | |||
| The following properties are common to the infrared remote controllers: | ||||
| 
 | ||||
| - linux,rc-map-name: string, specifies the scancode/key mapping table | ||||
|   defined in-kernel for the remote controller. Support values are: | ||||
|   * "rc-adstech-dvb-t-pci" | ||||
|   * "rc-alink-dtu-m" | ||||
|   * "rc-anysee" | ||||
|   * "rc-apac-viewcomp" | ||||
|   * "rc-asus-pc39" | ||||
|   * "rc-asus-ps3-100" | ||||
|   * "rc-ati-tv-wonder-hd-600" | ||||
|   * "rc-ati-x10" | ||||
|   * "rc-avermedia-a16d" | ||||
|   * "rc-avermedia-cardbus" | ||||
|   * "rc-avermedia-dvbt" | ||||
|   * "rc-avermedia-m135a" | ||||
|   * "rc-avermedia-m733a-rm-k6" | ||||
|   * "rc-avermedia-rm-ks" | ||||
|   * "rc-avermedia" | ||||
|   * "rc-avertv-303" | ||||
|   * "rc-azurewave-ad-tu700" | ||||
|   * "rc-behold-columbus" | ||||
|   * "rc-behold" | ||||
|   * "rc-budget-ci-old" | ||||
|   * "rc-cec" | ||||
|   * "rc-cinergy-1400" | ||||
|   * "rc-cinergy" | ||||
|   * "rc-delock-61959" | ||||
|   * "rc-dib0700-nec" | ||||
|   * "rc-dib0700-rc5" | ||||
|   * "rc-digitalnow-tinytwin" | ||||
|   * "rc-digittrade" | ||||
|   * "rc-dm1105-nec" | ||||
|   * "rc-dntv-live-dvbt-pro" | ||||
|   * "rc-dntv-live-dvb-t" | ||||
|   * "rc-dtt200u" | ||||
|   * "rc-dvbsky" | ||||
|   * "rc-empty" | ||||
|   * "rc-em-terratec" | ||||
|   * "rc-encore-enltv2" | ||||
|   * "rc-encore-enltv-fm53" | ||||
|   * "rc-encore-enltv" | ||||
|   * "rc-evga-indtube" | ||||
|   * "rc-eztv" | ||||
|   * "rc-flydvb" | ||||
|   * "rc-flyvideo" | ||||
|   * "rc-fusionhdtv-mce" | ||||
|   * "rc-gadmei-rm008z" | ||||
|   * "rc-geekbox" | ||||
|   * "rc-genius-tvgo-a11mce" | ||||
|   * "rc-gotview7135" | ||||
|   * "rc-hauppauge" | ||||
|   * "rc-imon-mce" | ||||
|   * "rc-imon-pad" | ||||
|   * "rc-iodata-bctv7e" | ||||
|   * "rc-it913x-v1" | ||||
|   * "rc-it913x-v2" | ||||
|   * "rc-kaiomy" | ||||
|   * "rc-kworld-315u" | ||||
|   * "rc-kworld-pc150u" | ||||
|   * "rc-kworld-plus-tv-analog" | ||||
|   * "rc-leadtek-y04g0051" | ||||
|   * "rc-lirc" | ||||
|   * "rc-lme2510" | ||||
|   * "rc-manli" | ||||
|   * "rc-medion-x10" | ||||
|   * "rc-medion-x10-digitainer" | ||||
|   * "rc-medion-x10-or2x" | ||||
|   * "rc-msi-digivox-ii" | ||||
|   * "rc-msi-digivox-iii" | ||||
|   * "rc-msi-tvanywhere-plus" | ||||
|   * "rc-msi-tvanywhere" | ||||
|   * "rc-nebula" | ||||
|   * "rc-nec-terratec-cinergy-xs" | ||||
|   * "rc-norwood" | ||||
|   * "rc-npgtech" | ||||
|   * "rc-pctv-sedna" | ||||
|   * "rc-pinnacle-color" | ||||
|   * "rc-pinnacle-grey" | ||||
|   * "rc-pinnacle-pctv-hd" | ||||
|   * "rc-pixelview-new" | ||||
|   * "rc-pixelview" | ||||
|   * "rc-pixelview-002t" | ||||
|   * "rc-pixelview-mk12" | ||||
|   * "rc-powercolor-real-angel" | ||||
|   * "rc-proteus-2309" | ||||
|   * "rc-purpletv" | ||||
|   * "rc-pv951" | ||||
|   * "rc-hauppauge" | ||||
|   * "rc-rc5-tv" | ||||
|   * "rc-rc6-mce" | ||||
|   * "rc-real-audio-220-32-keys" | ||||
|   * "rc-reddo" | ||||
|   * "rc-snapstream-firefly" | ||||
|   * "rc-streamzap" | ||||
|   * "rc-tbs-nec" | ||||
|   * "rc-technisat-ts35" | ||||
|   * "rc-technisat-usb2" | ||||
|   * "rc-terratec-cinergy-c-pci" | ||||
|   * "rc-terratec-cinergy-s2-hd" | ||||
|   * "rc-terratec-cinergy-xs" | ||||
|   * "rc-terratec-slim" | ||||
|   * "rc-terratec-slim-2" | ||||
|   * "rc-tevii-nec" | ||||
|   * "rc-tivo" | ||||
|   * "rc-total-media-in-hand" | ||||
|   * "rc-total-media-in-hand-02" | ||||
|   * "rc-trekstor" | ||||
|   * "rc-tt-1500" | ||||
|   * "rc-twinhan-dtv-cab-ci" | ||||
|   * "rc-twinhan1027" | ||||
|   * "rc-videomate-k100" | ||||
|   * "rc-videomate-s350" | ||||
|   * "rc-videomate-tv-pvr" | ||||
|   * "rc-winfast" | ||||
|   * "rc-winfast-usbii-deluxe" | ||||
|   * "rc-su3000" | ||||
							
								
								
									
										17
									
								
								Documentation/devicetree/bindings/media/st,st-delta.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Documentation/devicetree/bindings/media/st,st-delta.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| * STMicroelectronics DELTA multi-format video decoder | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible: should be "st,st-delta". | ||||
| - clocks: from common clock binding: handle hardware IP needed clocks, the | ||||
|   number of clocks may depend on the SoC type. | ||||
|   See ../clock/clock-bindings.txt for details. | ||||
| - clock-names: names of the clocks listed in clocks property in the same order. | ||||
| 
 | ||||
| Example: | ||||
| 	delta0 { | ||||
| 		compatible = "st,st-delta"; | ||||
| 		clock-names = "delta", "delta-st231", "delta-flash-promip"; | ||||
| 		clocks = <&clk_s_c0_flexgen CLK_VID_DMU>, | ||||
| 			 <&clk_s_c0_flexgen CLK_ST231_DMU>, | ||||
| 			 <&clk_s_c0_flexgen CLK_FLASH_PROMIP>; | ||||
| 	}; | ||||
|  | @ -9,7 +9,7 @@ Required properties: | |||
| - reg		    : should contain IO map address for IR. | ||||
| 
 | ||||
| Optional properties: | ||||
| - linux,rc-map-name : Remote control map name. | ||||
| - linux,rc-map-name: see rc.txt file in the same directory. | ||||
| - resets : phandle + reset specifier pair | ||||
| 
 | ||||
| Example: | ||||
|  |  | |||
							
								
								
									
										83
									
								
								Documentation/devicetree/bindings/media/ti,da850-vpif.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								Documentation/devicetree/bindings/media/ti,da850-vpif.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,83 @@ | |||
| Texas Instruments VPIF | ||||
| ---------------------- | ||||
| 
 | ||||
| The TI Video Port InterFace (VPIF) is the primary component for video | ||||
| capture and display on the DA850/AM18x family of TI DaVinci/Sitara | ||||
| SoCs. | ||||
| 
 | ||||
| TI Document reference: SPRUH82C, Chapter 35 | ||||
| http://www.ti.com/lit/pdf/spruh82 | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible: must be "ti,da850-vpif" | ||||
| - reg: physical base address and length of the registers set for the device; | ||||
| - interrupts: should contain IRQ line for the VPIF | ||||
| 
 | ||||
| Video Capture: | ||||
| 
 | ||||
| VPIF has a 16-bit parallel bus input, supporting 2 8-bit channels or a | ||||
| single 16-bit channel.  It should contain at least one port child node | ||||
| with child 'endpoint' node. Please refer to the bindings defined in | ||||
| Documentation/devicetree/bindings/media/video-interfaces.txt. | ||||
| 
 | ||||
| Example using 2 8-bit input channels, one of which is connected to an | ||||
| I2C-connected TVP5147 decoder: | ||||
| 
 | ||||
| 	vpif: vpif@217000 { | ||||
| 		compatible = "ti,da850-vpif"; | ||||
| 		reg = <0x217000 0x1000>; | ||||
| 		interrupts = <92>; | ||||
| 
 | ||||
| 		port { | ||||
| 			vpif_ch0: endpoint@0 { | ||||
| 				  reg = <0>; | ||||
| 				  bus-width = <8>; | ||||
| 				  remote-endpoint = <&composite>; | ||||
| 			}; | ||||
| 
 | ||||
| 			vpif_ch1: endpoint@1 { | ||||
| 				  reg = <1>; | ||||
| 				  bus-width = <8>; | ||||
| 				  data-shift = <8>; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| [ ... ] | ||||
| 
 | ||||
| &i2c0 { | ||||
| 
 | ||||
| 	tvp5147@5d { | ||||
| 		compatible = "ti,tvp5147"; | ||||
| 		reg = <0x5d>; | ||||
| 		status = "okay"; | ||||
| 
 | ||||
| 		port { | ||||
| 			composite: endpoint { | ||||
| 				hsync-active = <1>; | ||||
| 				vsync-active = <1>; | ||||
| 				pclk-sample = <0>; | ||||
| 
 | ||||
| 				/* VPIF channel 0 (lower 8-bits) */ | ||||
| 				remote-endpoint = <&vpif_ch0>; | ||||
| 				bus-width = <8>; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| Alternatively, an example when the bus is configured as a single | ||||
| 16-bit input (e.g. for raw-capture mode): | ||||
| 
 | ||||
| 	vpif: vpif@217000 { | ||||
| 		compatible = "ti,da850-vpif"; | ||||
| 		reg = <0x217000 0x1000>; | ||||
| 		interrupts = <92>; | ||||
| 
 | ||||
| 		port { | ||||
| 			vpif_ch0: endpoint { | ||||
| 				  bus-width = <16>; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
|  | @ -0,0 +1,10 @@ | |||
| Imagination Technologies' Pistachio SoC based Marduk Board | ||||
| ========================================================== | ||||
| 
 | ||||
| Compatible string must be "img,pistachio-marduk", "img,pistachio" | ||||
| 
 | ||||
| Hardware and other related documentation is available at | ||||
| https://docs.creatordev.io/ci40/ | ||||
| 
 | ||||
| It is also known as Creator Ci40. Marduk is legacy name and will | ||||
| be there for decades. | ||||
|  | @ -17,7 +17,7 @@ Required properties: | |||
| 	"core" - Main peripheral bus clock | ||||
| 	"clkin0" - Parent clock of internal mux | ||||
| 	"clkin1" - Other parent clock of internal mux | ||||
|   The driver has an interal mux clock which switches between clkin0 and clkin1 depending on the | ||||
|   The driver has an internal mux clock which switches between clkin0 and clkin1 depending on the | ||||
|   clock rate requested by the MMC core. | ||||
| 
 | ||||
| Example: | ||||
|  |  | |||
							
								
								
									
										16
									
								
								Documentation/devicetree/bindings/mmc/mmc-pwrseq-sd8787.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								Documentation/devicetree/bindings/mmc/mmc-pwrseq-sd8787.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | |||
| * Marvell SD8787 power sequence provider | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible: must be "mmc-pwrseq-sd8787". | ||||
| - powerdown-gpios: contains a power down GPIO specifier with the | ||||
| 		   default active state | ||||
| - reset-gpios: contains a reset GPIO specifier with the default | ||||
| 		   active state | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 	wifi_pwrseq: wifi_pwrseq { | ||||
| 		compatible = "mmc-pwrseq-sd8787"; | ||||
| 		powerdown-gpios = <&twl_gpio 0 GPIO_ACTIVE_LOW>; | ||||
| 		reset-gpios = <&twl_gpio 1 GPIO_ACTIVE_LOW>; | ||||
| 	} | ||||
|  | @ -40,6 +40,7 @@ Optional properties: | |||
| - cap-mmc-hw-reset: eMMC hardware reset is supported | ||||
| - cap-sdio-irq: enable SDIO IRQ signalling on this interface | ||||
| - full-pwr-cycle: full power cycle of the card is supported | ||||
| - mmc-ddr-3_3v: eMMC high-speed DDR mode(3.3V I/O) is supported | ||||
| - mmc-ddr-1_8v: eMMC high-speed DDR mode(1.8V I/O) is supported | ||||
| - mmc-ddr-1_2v: eMMC high-speed DDR mode(1.2V I/O) is supported | ||||
| - mmc-hs200-1_8v: eMMC HS200 mode(1.8V I/O) is supported | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ Optional properties: | |||
| - bus-width:		Number of data lines. | ||||
| 			See:  Documentation/devicetree/bindings/mmc/mmc.txt. | ||||
| 
 | ||||
| - max-frequency:	Can be 200MHz, 100Mz or 50MHz (default) and used for | ||||
| - max-frequency:	Can be 200MHz, 100MHz or 50MHz (default) and used for | ||||
| 			configuring the CCONFIG3 in the mmcss. | ||||
| 			See:  Documentation/devicetree/bindings/mmc/mmc.txt. | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ host controllers refer to the mmc[1] bindings. | |||
| 
 | ||||
| Optional properties: | ||||
| - sdhci-caps-mask: The sdhci capabilities register is incorrect. This 64bit | ||||
|   property corresponds to the bits in the sdhci capabilty register. If the bit | ||||
|   property corresponds to the bits in the sdhci capability register. If the bit | ||||
|   is on in the mask then the bit is incorrect in the register and should be | ||||
|   turned off, before applying sdhci-caps. | ||||
| - sdhci-caps: The sdhci capabilities register is incorrect. This 64bit | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ Required properties: | |||
|    * "allwinner,sun5i-a13-mmc" | ||||
|    * "allwinner,sun7i-a20-mmc" | ||||
|    * "allwinner,sun9i-a80-mmc" | ||||
|    * "allwinner,sun50i-a64-emmc" | ||||
|    * "allwinner,sun50i-a64-mmc" | ||||
|  - reg : mmc controller base registers | ||||
|  - clocks : a list with 4 phandle + clock specifier pairs | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ Required Properties: | |||
|   each child-node representing a supported slot. There should be atleast one | ||||
|   child node representing a card slot. The name of the child node representing | ||||
|   the slot is recommended to be slot@n where n is the unique number of the slot | ||||
|   connnected to the controller. The following are optional properties which | ||||
|   connected to the controller. The following are optional properties which | ||||
|   can be included in the slot child node. | ||||
| 
 | ||||
| 	* reg: specifies the physical slot number. The valid values of this | ||||
|  | @ -75,6 +75,17 @@ Optional properties: | |||
| * card-detect-delay: Delay in milli-seconds before detecting card after card | ||||
|   insert event. The default value is 0. | ||||
| 
 | ||||
| * data-addr: Override fifo address with value provided by DT. The default FIFO reg | ||||
|   offset is assumed as 0x100 (version < 0x240A) and 0x200(version >= 0x240A) by | ||||
|   driver. If the controller does not follow this rule, please use this property | ||||
|   to set fifo address in device tree. | ||||
| 
 | ||||
| * fifo-watermark-aligned: Data done irq is expected if data length is less than | ||||
|   watermark in PIO mode. But fifo watermark is requested to be aligned with data | ||||
|   length in some SoC so that TX/RX irq can be generated with data done irq. Add this | ||||
|   watermark quirk to mark this requirement and force fifo watermark setting | ||||
|   accordingly. | ||||
| 
 | ||||
| * vmmc-supply: The phandle to the regulator to use for vmmc.  If this is | ||||
|   specified we'll defer probe until we can find this regulator. | ||||
| 
 | ||||
|  | @ -102,6 +113,8 @@ board specific portions as listed below. | |||
| 		interrupts = <0 75 0>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		data-addr = <0x200>; | ||||
| 		fifo-watermark-aligned; | ||||
| 		resets = <&rst 20>; | ||||
| 		reset-names = "reset"; | ||||
| 	}; | ||||
|  |  | |||
|  | @ -25,6 +25,19 @@ Required properties: | |||
| 		"renesas,sdhi-r8a7795" - SDHI IP on R8A7795 SoC | ||||
| 		"renesas,sdhi-r8a7796" - SDHI IP on R8A7796 SoC | ||||
| 
 | ||||
| - clocks: Most controllers only have 1 clock source per channel. However, on | ||||
| 	  some variations of this controller, the internal card detection | ||||
| 	  logic that exists in this controller is sectioned off to be run by a | ||||
| 	  separate second clock source to allow the main core clock to be turned | ||||
| 	  off to save power. | ||||
| 	  If 2 clocks are specified by the hardware, you must name them as | ||||
| 	  "core" and "cd". If the controller only has 1 clock, naming is not | ||||
| 	  required. | ||||
| 	  Below is the number clocks for each supported SoC: | ||||
| 	   1: SH73A0, R8A73A4, R8A7740, R8A7778, R8A7779, R8A7790 | ||||
| 	      R8A7791, R8A7792, R8A7793, R8A7794, R8A7795, R8A7796 | ||||
| 	   2: R7S72100 | ||||
| 
 | ||||
| Optional properties: | ||||
| - toshiba,mmc-wrprotect-disable: write-protect detection is unavailable | ||||
| - pinctrl-names: should be "default", "state_uhs" | ||||
|  |  | |||
							
								
								
									
										33
									
								
								Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | |||
| * ZTE specific extensions to the Synopsys Designware Mobile Storage | ||||
|   Host Controller | ||||
| 
 | ||||
| The Synopsys designware mobile storage host controller is used to interface | ||||
| a SoC with storage medium such as eMMC or SD/MMC cards. This file documents | ||||
| differences between the core Synopsys dw mshc controller properties described | ||||
| by synopsys-dw-mshc.txt and the properties used by the ZTE specific | ||||
| extensions to the Synopsys Designware Mobile Storage Host Controller. | ||||
| 
 | ||||
| Required Properties: | ||||
| 
 | ||||
| * compatible: should be | ||||
| 	- "zte,zx296718-dw-mshc": for ZX SoCs | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 	mmc1: mmc@1110000 { | ||||
| 		compatible = "zte,zx296718-dw-mshc"; | ||||
| 		reg = <0x01110000 0x1000>; | ||||
| 		interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 		fifo-depth = <32>; | ||||
| 		data-addr = <0x200>; | ||||
| 		fifo-watermark-aligned; | ||||
| 		bus-width = <4>; | ||||
| 		clock-frequency = <50000000>; | ||||
| 		clocks = <&topcrm SD0_AHB>, <&topcrm SD0_WCLK>; | ||||
| 		clock-names = "biu", "ciu"; | ||||
| 		num-slots = <1>; | ||||
| 		max-frequency = <50000000>; | ||||
| 		cap-sdio-irq; | ||||
| 		cap-sd-highspeed; | ||||
| 		status = "disabled"; | ||||
| 	}; | ||||
|  | @ -1,4 +1,4 @@ | |||
| Marvell 8897/8997 (sd8897/sd8997/pcie8997) SDIO/PCIE devices | ||||
| Marvell 8787/8897/8997 (sd8787/sd8897/sd8997/pcie8997) SDIO/PCIE devices | ||||
| ------ | ||||
| 
 | ||||
| This node provides properties for controlling the Marvell SDIO/PCIE wireless device. | ||||
|  | @ -8,6 +8,7 @@ connects the device to the system. | |||
| Required properties: | ||||
| 
 | ||||
|   - compatible : should be one of the following: | ||||
| 	* "marvell,sd8787" | ||||
| 	* "marvell,sd8897" | ||||
| 	* "marvell,sd8997" | ||||
| 	* "pci11ab,2b42" | ||||
|  | @ -34,6 +35,9 @@ Optional properties: | |||
| 		 so that the wifi chip can wakeup host platform under certain condition. | ||||
| 		 during system resume, the irq will be disabled to make sure | ||||
| 		 unnecessary interrupt is not received. | ||||
|   - vmmc-supply: a phandle of a regulator, supplying VCC to the card | ||||
|   - mmc-pwrseq:  phandle to the MMC power sequence node. See "mmc-pwrseq-*" | ||||
| 		 for documentation of MMC power sequence bindings. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
|  | @ -46,6 +50,7 @@ so that firmware can wakeup host using this device side pin. | |||
| &mmc3 { | ||||
| 	status = "okay"; | ||||
| 	vmmc-supply = <&wlan_en_reg>; | ||||
| 	mmc-pwrseq = <&wifi_pwrseq>; | ||||
| 	bus-width = <4>; | ||||
| 	cap-power-off-card; | ||||
| 	keep-power-in-suspend; | ||||
|  |  | |||
|  | @ -23,6 +23,7 @@ Required properties: | |||
|   "allwinner,sun8i-h3-pinctrl" | ||||
|   "allwinner,sun8i-h3-r-pinctrl" | ||||
|   "allwinner,sun50i-a64-pinctrl" | ||||
|   "allwinner,sun50i-h5-r-pinctrl" | ||||
|   "nextthing,gr8-pinctrl" | ||||
| 
 | ||||
| - reg: Should contain the register physical address and length for the | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ iomuxc: iomuxc@30330000 { | |||
| 	reg = <0x30330000 0x10000>; | ||||
| }; | ||||
| 
 | ||||
| Pheriparials using pads from iomuxc-lpsr support low state retention power | ||||
| Peripherals using pads from iomuxc-lpsr support low state retention power | ||||
| state, under LPSR mode GPIO's state of pads are retain. | ||||
| 
 | ||||
| Please refer to fsl,imx-pinctrl.txt in this directory for common binding part | ||||
|  |  | |||
|  | @ -0,0 +1,46 @@ | |||
| * Marvell 98dx3236 pinctrl driver for mpp | ||||
| 
 | ||||
| Please refer to marvell,mvebu-pinctrl.txt in this directory for common binding | ||||
| part and usage | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible: "marvell,98dx3236-pinctrl" or "marvell,98dx4251-pinctrl" | ||||
| - reg: register specifier of MPP registers | ||||
| 
 | ||||
| This driver supports all 98dx3236, 98dx3336 and 98dx4251 variants | ||||
| 
 | ||||
| name          pins     functions | ||||
| ================================================================================ | ||||
| mpp0          0        gpo, spi0(mosi), dev(ad8) | ||||
| mpp1          1        gpio, spi0(miso), dev(ad9) | ||||
| mpp2          2        gpo, spi0(sck), dev(ad10) | ||||
| mpp3          3        gpio, spi0(cs0), dev(ad11) | ||||
| mpp4          4        gpio, spi0(cs1), smi(mdc), dev(cs0) | ||||
| mpp5          5        gpio, pex(rsto), sd0(cmd), dev(bootcs) | ||||
| mpp6          6        gpo, sd0(clk), dev(a2) | ||||
| mpp7          7        gpio, sd0(d0), dev(ale0) | ||||
| mpp8          8        gpio, sd0(d1), dev(ale1) | ||||
| mpp9          9        gpio, sd0(d2), dev(ready0) | ||||
| mpp10         10       gpio, sd0(d3), dev(ad12) | ||||
| mpp11         11       gpio, uart1(rxd), uart0(cts), dev(ad13) | ||||
| mpp12         12       gpo, uart1(txd), uart0(rts), dev(ad14) | ||||
| mpp13         13       gpio, intr(out), dev(ad15) | ||||
| mpp14         14       gpio, i2c0(sck) | ||||
| mpp15         15       gpio, i2c0(sda) | ||||
| mpp16         16       gpo, dev(oe) | ||||
| mpp17         17       gpo, dev(clkout) | ||||
| mpp18         18       gpio, uart1(txd) | ||||
| mpp19         19       gpio, uart1(rxd), dev(rb) | ||||
| mpp20         20       gpo, dev(we0) | ||||
| mpp21         21       gpo, dev(ad0) | ||||
| mpp22         22       gpo, dev(ad1) | ||||
| mpp23         23       gpo, dev(ad2) | ||||
| mpp24         24       gpo, dev(ad3) | ||||
| mpp25         25       gpo, dev(ad4) | ||||
| mpp26         26       gpo, dev(ad5) | ||||
| mpp27         27       gpo, dev(ad6) | ||||
| mpp28         28       gpo, dev(ad7) | ||||
| mpp29         29       gpo, dev(a0) | ||||
| mpp30         30       gpo, dev(a1) | ||||
| mpp31         31       gpio, slv_smi(mdc), smi(mdc), dev(we1) | ||||
| mpp32         32       gpio, slv_smi(mdio), smi(mdio), dev(cs1) | ||||
|  | @ -44,16 +44,16 @@ mpp16         16       gpio, sdio(d2), uart0(cts), uart1(rxd), mii(crs) | |||
| mpp17         17       gpio, sdio(d3) | ||||
| mpp18         18       gpo, nand(io0) | ||||
| mpp19         19       gpo, nand(io1) | ||||
| mpp20         20       gpio, mii(rxerr) | ||||
| mpp21         21       gpio, audio(spdifi) | ||||
| mpp22         22       gpio, audio(spdifo) | ||||
| mpp23         23       gpio, audio(rmclk) | ||||
| mpp24         24       gpio, audio(bclk) | ||||
| mpp25         25       gpio, audio(sdo) | ||||
| mpp26         26       gpio, audio(lrclk) | ||||
| mpp27         27       gpio, audio(mclk) | ||||
| mpp28         28       gpio, audio(sdi) | ||||
| mpp29         29       gpio, audio(extclk) | ||||
| mpp35         35       gpio, mii(rxerr) | ||||
| mpp36         36       gpio, audio(spdifi) | ||||
| mpp37         37       gpio, audio(spdifo) | ||||
| mpp38         38       gpio, audio(rmclk) | ||||
| mpp39         39       gpio, audio(bclk) | ||||
| mpp40         40       gpio, audio(sdo) | ||||
| mpp41         41       gpio, audio(lrclk) | ||||
| mpp42         42       gpio, audio(mclk) | ||||
| mpp43         43       gpio, audio(sdi) | ||||
| mpp44         44       gpio, audio(extclk) | ||||
| 
 | ||||
| * Marvell Kirkwood 88f6190 | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,25 +1,38 @@ | |||
| ====================== | ||||
| Aspeed Pin Controllers | ||||
| ---------------------- | ||||
| ====================== | ||||
| 
 | ||||
| The Aspeed SoCs vary in functionality inside a generation but have a common mux | ||||
| device register layout. | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible : Should be any one of the following: | ||||
| 		"aspeed,ast2400-pinctrl" | ||||
| 		"aspeed,g4-pinctrl" | ||||
| 		"aspeed,ast2500-pinctrl" | ||||
| 		"aspeed,g5-pinctrl" | ||||
| Required properties for g4: | ||||
| - compatible : 			Should be one of the following: | ||||
| 				"aspeed,ast2400-pinctrl" | ||||
| 				"aspeed,g4-pinctrl" | ||||
| 
 | ||||
| The pin controller node should be a child of a syscon node with the required | ||||
| Required properties for g5: | ||||
| - compatible : 			Should be one of the following: | ||||
| 				"aspeed,ast2500-pinctrl" | ||||
| 				"aspeed,g5-pinctrl" | ||||
| 
 | ||||
| - aspeed,external-nodes:	A cell of phandles to external controller nodes: | ||||
| 				0: compatible with "aspeed,ast2500-gfx", "syscon" | ||||
| 				1: compatible with "aspeed,ast2500-lhc", "syscon" | ||||
| 
 | ||||
| The pin controller node should be the child of a syscon node with the required | ||||
| property: | ||||
| - compatible: "syscon", "simple-mfd" | ||||
| 
 | ||||
| - compatible : 		Should be one of the following: | ||||
| 			"aspeed,ast2400-scu", "syscon", "simple-mfd" | ||||
| 			"aspeed,g4-scu", "syscon", "simple-mfd" | ||||
| 			"aspeed,ast2500-scu", "syscon", "simple-mfd" | ||||
| 			"aspeed,g5-scu", "syscon", "simple-mfd" | ||||
| 
 | ||||
| Refer to the the bindings described in | ||||
| Documentation/devicetree/bindings/mfd/syscon.txt | ||||
| 
 | ||||
| Subnode Format | ||||
| -------------- | ||||
| ============== | ||||
| 
 | ||||
| The required properties of child nodes are (as defined in pinctrl-bindings): | ||||
| - function | ||||
|  | @ -31,26 +44,43 @@ supported: | |||
| 
 | ||||
| aspeed,ast2400-pinctrl, aspeed,g4-pinctrl: | ||||
| 
 | ||||
| ACPI BMCINT DDCCLK DDCDAT FLACK FLBUSY FLWP GPID0 GPIE0 GPIE2 GPIE4 GPIE6 I2C10 | ||||
| I2C11 I2C12 I2C13 I2C3 I2C4 I2C5 I2C6 I2C7 I2C8 I2C9 LPCPD LPCPME LPCSMI MDIO1 | ||||
| MDIO2 NCTS1 NCTS3 NCTS4 NDCD1 NDCD3 NDCD4 NDSR1 NDSR3 NDTR1 NDTR3 NRI1 NRI3 | ||||
| NRI4 NRTS1 NRTS3 PWM0 PWM1 PWM2 PWM3 PWM4 PWM5 PWM6 PWM7 RGMII1 RMII1 ROM16 | ||||
| ROM8 ROMCS1 ROMCS2 ROMCS3 ROMCS4 RXD1 RXD3 RXD4 SD1 SGPMI SIOPBI SIOPBO TIMER3 | ||||
| TIMER5 TIMER6 TIMER7 TIMER8 TXD1 TXD3 TXD4 UART6 VGAHS VGAVS VPI18 VPI24 VPI30 | ||||
| VPO12 VPO24 | ||||
| ACPI ADC0 ADC1 ADC10 ADC11 ADC12 ADC13 ADC14 ADC15 ADC2 ADC3 ADC4 ADC5 ADC6 | ||||
| ADC7 ADC8 ADC9 BMCINT DDCCLK DDCDAT EXTRST FLACK FLBUSY FLWP GPID GPID0 GPID2 | ||||
| GPID4 GPID6 GPIE0 GPIE2 GPIE4 GPIE6 I2C10 I2C11 I2C12 I2C13 I2C14 I2C3 I2C4 | ||||
| I2C5 I2C6 I2C7 I2C8 I2C9 LPCPD LPCPME LPCRST LPCSMI MAC1LINK MAC2LINK MDIO1 | ||||
| MDIO2 NCTS1 NCTS2 NCTS3 NCTS4 NDCD1 NDCD2 NDCD3 NDCD4 NDSR1 NDSR2 NDSR3 NDSR4 | ||||
| NDTR1 NDTR2 NDTR3 NDTR4 NDTS4 NRI1 NRI2 NRI3 NRI4 NRTS1 NRTS2 NRTS3 OSCCLK PWM0 | ||||
| PWM1 PWM2 PWM3 PWM4 PWM5 PWM6 PWM7 RGMII1 RGMII2 RMII1 RMII2 ROM16 ROM8 ROMCS1 | ||||
| ROMCS2 ROMCS3 ROMCS4 RXD1 RXD2 RXD3 RXD4 SALT1 SALT2 SALT3 SALT4 SD1 SD2 SGPMCK | ||||
| SGPMI SGPMLD SGPMO SGPSCK SGPSI0 SGPSI1 SGPSLD SIOONCTRL SIOPBI SIOPBO SIOPWREQ | ||||
| SIOPWRGD SIOS3 SIOS5 SIOSCI SPI1 SPI1DEBUG SPI1PASSTHRU SPICS1 TIMER3 TIMER4 | ||||
| TIMER5 TIMER6 TIMER7 TIMER8 TXD1 TXD2 TXD3 TXD4 UART6 USBCKI VGABIOS_ROM VGAHS | ||||
| VGAVS VPI18 VPI24 VPI30 VPO12 VPO24 WDTRST1 WDTRST2 | ||||
| 
 | ||||
| aspeed,ast2500-pinctrl, aspeed,g5-pinctrl: | ||||
| 
 | ||||
| GPID0 GPID2 GPIE0 I2C10 I2C11 I2C12 I2C13 I2C14 I2C3 I2C4 I2C5 I2C6 I2C7 I2C8 | ||||
| I2C9 MAC1LINK MDIO1 MDIO2 OSCCLK PEWAKE PWM0 PWM1 PWM2 PWM3 PWM4 PWM5 PWM6 PWM7 | ||||
| RGMII1 RGMII2 RMII1 RMII2 SD1 SPI1 SPI1DEBUG SPI1PASSTHRU TIMER4 TIMER5 TIMER6 | ||||
| TIMER7 TIMER8 VGABIOSROM | ||||
| ACPI ADC0 ADC1 ADC10 ADC11 ADC12 ADC13 ADC14 ADC15 ADC2 ADC3 ADC4 ADC5 ADC6 | ||||
| ADC7 ADC8 ADC9 BMCINT DDCCLK DDCDAT ESPI FWSPICS1 FWSPICS2 GPID0 GPID2 GPID4 | ||||
| GPID6 GPIE0 GPIE2 GPIE4 GPIE6 I2C10 I2C11 I2C12 I2C13 I2C14 I2C3 I2C4 I2C5 I2C6 | ||||
| I2C7 I2C8 I2C9 LAD0 LAD1 LAD2 LAD3 LCLK LFRAME LPCHC LPCPD LPCPLUS LPCPME | ||||
| LPCRST LPCSMI LSIRQ MAC1LINK MAC2LINK MDIO1 MDIO2 NCTS1 NCTS2 NCTS3 NCTS4 NDCD1 | ||||
| NDCD2 NDCD3 NDCD4 NDSR1 NDSR2 NDSR3 NDSR4 NDTR1 NDTR2 NDTR3 NDTR4 NRI1 NRI2 | ||||
| NRI3 NRI4 NRTS1 NRTS2 NRTS3 NRTS4 OSCCLK PEWAKE PNOR PWM0 PWM1 PWM2 PWM3 PWM4 | ||||
| PWM5 PWM6 PWM7 RGMII1 RGMII2 RMII1 RMII2 RXD1 RXD2 RXD3 RXD4 SALT1 SALT10 | ||||
| SALT11 SALT12 SALT13 SALT14 SALT2 SALT3 SALT4 SALT5 SALT6 SALT7 SALT8 SALT9 | ||||
| SCL1 SCL2 SD1 SD2 SDA1 SDA2 SGPS1 SGPS2 SIOONCTRL SIOPBI SIOPBO SIOPWREQ | ||||
| SIOPWRGD SIOS3 SIOS5 SIOSCI SPI1 SPI1CS1 SPI1DEBUG SPI1PASSTHRU SPI2CK SPI2CS0 | ||||
| SPI2CS1 SPI2MISO SPI2MOSI TIMER3 TIMER4 TIMER5 TIMER6 TIMER7 TIMER8 TXD1 TXD2 | ||||
| TXD3 TXD4 UART6 USBCKI VGABIOSROM VGAHS VGAVS VPI24 VPO WDTRST1 WDTRST2 | ||||
| 
 | ||||
| Examples | ||||
| ======== | ||||
| 
 | ||||
| Examples: | ||||
| g4 Example | ||||
| ---------- | ||||
| 
 | ||||
| syscon: scu@1e6e2000 { | ||||
| 	compatible = "syscon", "simple-mfd"; | ||||
| 	compatible = "aspeed,ast2400-scu", "syscon", "simple-mfd"; | ||||
| 	reg = <0x1e6e2000 0x1a8>; | ||||
| 
 | ||||
| 	pinctrl: pinctrl { | ||||
|  | @ -63,5 +93,56 @@ syscon: scu@1e6e2000 { | |||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| g5 Example | ||||
| ---------- | ||||
| 
 | ||||
| ahb { | ||||
| 	apb { | ||||
| 		syscon: scu@1e6e2000 { | ||||
| 			compatible = "aspeed,ast2500-scu", "syscon", "simple-mfd"; | ||||
| 			reg = <0x1e6e2000 0x1a8>; | ||||
| 
 | ||||
| 			pinctrl: pinctrl { | ||||
| 				compatible = "aspeed,g5-pinctrl"; | ||||
| 				aspeed,external-nodes = <&gfx &lhc>; | ||||
| 
 | ||||
| 				pinctrl_i2c3_default: i2c3_default { | ||||
| 					function = "I2C3"; | ||||
| 					groups = "I2C3"; | ||||
| 				}; | ||||
| 			}; | ||||
| 		}; | ||||
| 
 | ||||
| 		gfx: display@1e6e6000 { | ||||
| 			compatible = "aspeed,ast2500-gfx", "syscon"; | ||||
| 			reg = <0x1e6e6000 0x1000>; | ||||
| 		}; | ||||
| 	}; | ||||
| 
 | ||||
| 	lpc: lpc@1e789000 { | ||||
| 		compatible = "aspeed,ast2500-lpc", "simple-mfd"; | ||||
| 		reg = <0x1e789000 0x1000>; | ||||
| 
 | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		ranges = <0x0 0x1e789000 0x1000>; | ||||
| 
 | ||||
| 		lpc_host: lpc-host@80 { | ||||
| 			compatible = "aspeed,ast2500-lpc-host", "simple-mfd", "syscon"; | ||||
| 			reg = <0x80 0x1e0>; | ||||
| 			reg-io-width = <4>; | ||||
| 
 | ||||
| 			#address-cells = <1>; | ||||
| 			#size-cells = <1>; | ||||
| 			ranges = <0x0 0x80 0x1e0>; | ||||
| 
 | ||||
| 			lhc: lhc@20 { | ||||
| 			       compatible = "aspeed,ast2500-lhc"; | ||||
| 			       reg = <0x20 0x24 0x48 0x8>; | ||||
| 			}; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
| 
 | ||||
| Please refer to pinctrl-bindings.txt in this directory for details of the | ||||
| common pinctrl bindings used by client devices. | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ Required Properties: | |||
|   - "samsung,s3c2450-pinctrl": for S3C2450-compatible pin-controller, | ||||
|   - "samsung,s3c64xx-pinctrl": for S3C64xx-compatible pin-controller, | ||||
|   - "samsung,s5pv210-pinctrl": for S5PV210-compatible pin-controller, | ||||
|   - "samsung,exynos3250-pinctrl": for Exynos3250 compatible pin-controller. | ||||
|   - "samsung,exynos4210-pinctrl": for Exynos4210 compatible pin-controller. | ||||
|   - "samsung,exynos4x12-pinctrl": for Exynos4x12 compatible pin-controller. | ||||
|   - "samsung,exynos5250-pinctrl": for Exynos5250 compatible pin-controller. | ||||
|  |  | |||
|  | @ -8,8 +8,9 @@ controllers onto these pads. | |||
| Pin controller node: | ||||
| Required properies: | ||||
|  - compatible: value should be one of the following: | ||||
|    (a) "st,stm32f429-pinctrl" | ||||
|    (b) "st,stm32f746-pinctrl" | ||||
|    "st,stm32f429-pinctrl" | ||||
|    "st,stm32f746-pinctrl" | ||||
|    "st,stm32h743-pinctrl" | ||||
|  - #address-cells: The value of this property must be 1 | ||||
|  - #size-cells	: The value of this property must be 1 | ||||
|  - ranges	: defines mapping between pin controller node (parent) to | ||||
|  | @ -37,8 +38,23 @@ Optional properties: | |||
|  - st,syscfg: Should be phandle/offset pair. The phandle to the syscon node | ||||
|    which includes IRQ mux selection register, and the offset of the IRQ mux | ||||
|    selection register. | ||||
|  - ngpios: Number of gpios in a bank (to use if bank gpio numbers is less | ||||
|    than 16). | ||||
|  - gpio-ranges: Define a dedicated mapping between a pin-controller and | ||||
|    a gpio controller. Format is <&phandle a b c> with: | ||||
| 	-(phandle): phandle of pin-controller. | ||||
| 	-(a): gpio base offset in range. | ||||
| 	-(b): pin base offset in range. | ||||
| 	-(c): gpio count in range | ||||
|    This entry has to be used either if there are holes inside a bank: | ||||
| 	GPIOB0/B1/B2/B14/B15 (see example 2) | ||||
|    or if banks are not contiguous: | ||||
| 	GPIOA/B/C/E... | ||||
|    NOTE: If "gpio-ranges" is used for a gpio controller, all gpio-controller | ||||
|    have to use a "gpio-ranges" entry. | ||||
|    More details in Documentation/devicetree/bindings/gpio/gpio.txt. | ||||
| 
 | ||||
| Example: | ||||
| Example 1: | ||||
| #include <dt-bindings/pinctrl/stm32f429-pinfunc.h> | ||||
| ... | ||||
| 
 | ||||
|  | @ -60,6 +76,43 @@ Example: | |||
| 		pin-functions nodes follow... | ||||
| 	}; | ||||
| 
 | ||||
| Example 2: | ||||
| #include <dt-bindings/pinctrl/stm32f429-pinfunc.h> | ||||
| ... | ||||
| 
 | ||||
| 	pinctrl: pin-controller { | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <1>; | ||||
| 		compatible = "st,stm32f429-pinctrl"; | ||||
| 		ranges = <0 0x40020000 0x3000>; | ||||
| 		pins-are-numbered; | ||||
| 
 | ||||
| 		gpioa: gpio@40020000 { | ||||
| 			gpio-controller; | ||||
| 			#gpio-cells = <2>; | ||||
| 			reg = <0x0 0x400>; | ||||
| 			resets = <&reset_ahb1 0>; | ||||
| 			st,bank-name = "GPIOA"; | ||||
| 			gpio-ranges = <&pinctrl 0 0 16>; | ||||
| 		}; | ||||
| 
 | ||||
| 		gpiob: gpio@40020400 { | ||||
| 			gpio-controller; | ||||
| 			#gpio-cells = <2>; | ||||
| 			reg = <0x0 0x400>; | ||||
| 			resets = <&reset_ahb1 0>; | ||||
| 			st,bank-name = "GPIOB"; | ||||
| 			ngpios = 4; | ||||
| 			gpio-ranges = <&pinctrl 0 16 3>, | ||||
| 				      <&pinctrl 14 30 2>; | ||||
| 		}; | ||||
| 
 | ||||
| 
 | ||||
| 		... | ||||
| 		pin-functions nodes follow... | ||||
| 	}; | ||||
| 
 | ||||
| 
 | ||||
| Contents of function subnode node: | ||||
| ---------------------------------- | ||||
| Subnode format | ||||
|  |  | |||
							
								
								
									
										47
									
								
								Documentation/devicetree/bindings/pinctrl/ti,iodelay.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								Documentation/devicetree/bindings/pinctrl/ti,iodelay.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | |||
| * Pin configuration for TI IODELAY controller | ||||
| 
 | ||||
| TI dra7 based SoCs such as am57xx have a controller for setting the IO delay | ||||
| for each pin. For most part the IO delay values are programmed by the bootloader, | ||||
| but some pins need to be configured dynamically by the kernel such as the | ||||
| MMC pins. | ||||
| 
 | ||||
| Required Properties: | ||||
| 
 | ||||
|   - compatible: Must be "ti,dra7-iodelay" | ||||
|   - reg: Base address and length of the memory resource used | ||||
|   - #address-cells: Number of address cells | ||||
|   - #size-cells: Size of cells | ||||
|   - #pinctrl-cells: Number of pinctrl cells, must be 2. See also | ||||
|     Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt | ||||
| 
 | ||||
| Example | ||||
| ------- | ||||
| 
 | ||||
| In the SoC specific dtsi file: | ||||
| 
 | ||||
| 	dra7_iodelay_core: padconf@4844a000 { | ||||
| 		compatible = "ti,dra7-iodelay"; | ||||
| 		reg = <0x4844a000 0x0d1c>; | ||||
| 		#address-cells = <1>; | ||||
| 		#size-cells = <0>; | ||||
| 		#pinctrl-cells = <2>; | ||||
| 	}; | ||||
| 
 | ||||
| In board-specific file: | ||||
| 
 | ||||
| &dra7_iodelay_core { | ||||
| 	mmc2_iodelay_3v3_conf: mmc2_iodelay_3v3_conf { | ||||
| 		pinctrl-pin-array = < | ||||
| 		0x18c A_DELAY_PS(0) G_DELAY_PS(120)	/* CFG_GPMC_A19_IN */ | ||||
| 		0x1a4 A_DELAY_PS(265) G_DELAY_PS(360)	/* CFG_GPMC_A20_IN */ | ||||
| 		0x1b0 A_DELAY_PS(0) G_DELAY_PS(120)	/* CFG_GPMC_A21_IN */ | ||||
| 		0x1bc A_DELAY_PS(0) G_DELAY_PS(120)	/* CFG_GPMC_A22_IN */ | ||||
| 		0x1c8 A_DELAY_PS(287) G_DELAY_PS(420)	/* CFG_GPMC_A23_IN */ | ||||
| 		0x1d4 A_DELAY_PS(144) G_DELAY_PS(240)	/* CFG_GPMC_A24_IN */ | ||||
| 		0x1e0 A_DELAY_PS(0) G_DELAY_PS(0)	/* CFG_GPMC_A25_IN */ | ||||
| 		0x1ec A_DELAY_PS(120) G_DELAY_PS(0)	/* CFG_GPMC_A26_IN */ | ||||
| 		0x1f8 A_DELAY_PS(120) G_DELAY_PS(180)	/* CFG_GPMC_A27_IN */ | ||||
| 		0x360 A_DELAY_PS(0) G_DELAY_PS(0)	/* CFG_GPMC_CS1_IN */ | ||||
| 		>; | ||||
| 	}; | ||||
| }; | ||||
|  | @ -14,6 +14,7 @@ Optional properties: | |||
| - anatop-delay-bit-shift: Bit shift for the step time register | ||||
| - anatop-delay-bit-width: Number of bits used in the step time register | ||||
| - vin-supply: The supply for this regulator | ||||
| - anatop-enable-bit: Regulator enable bit offset | ||||
| 
 | ||||
| Any property defined as part of the core regulator | ||||
| binding, defined in regulator.txt, can also be used. | ||||
|  |  | |||
|  | @ -0,0 +1,34 @@ | |||
| Motorola CPCAP PMIC voltage regulators | ||||
| ------------------------------------ | ||||
| 
 | ||||
| Requires node properties: | ||||
| - "compatible" value one of: | ||||
|     "motorola,cpcap-regulator" | ||||
|     "motorola,mapphone-cpcap-regulator" | ||||
| 
 | ||||
| Required regulator properties: | ||||
| - "regulator-name" | ||||
| - "regulator-enable-ramp-delay" | ||||
| - "regulator-min-microvolt" | ||||
| - "regulator-max-microvolt" | ||||
| 
 | ||||
| Optional regulator properties: | ||||
| - "regulator-boot-on" | ||||
| 
 | ||||
| See Documentation/devicetree/bindings/regulator/regulator.txt | ||||
| for more details about the regulator properties. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| cpcap_regulator: regulator { | ||||
| 	compatible = "motorola,cpcap-regulator"; | ||||
| 
 | ||||
| 	cpcap_regulators: regulators { | ||||
| 		sw5: SW5 { | ||||
| 			regulator-min-microvolt = <5050000>; | ||||
| 			regulator-max-microvolt = <5050000>; | ||||
| 			regulator-enable-ramp-delay = <50000>; | ||||
| 			regulator-boot-on; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  | @ -13,7 +13,7 @@ Optional properties: | |||
| - startup-delay-us	: Startup time in microseconds. | ||||
| - enable-active-high	: Polarity of GPIO is active high (default is low). | ||||
| - regulator-type	: Specifies what is being regulated, must be either | ||||
| 			  "voltage" or "current", defaults to current. | ||||
| 			  "voltage" or "current", defaults to voltage. | ||||
| 
 | ||||
| Any property defined as part of the core regulator binding defined in | ||||
| regulator.txt can also be used. | ||||
|  |  | |||
|  | @ -22,6 +22,7 @@ Regulator nodes are identified by their compatible: | |||
| 		    "qcom,rpm-pm8841-regulators" | ||||
| 		    "qcom,rpm-pm8916-regulators" | ||||
| 		    "qcom,rpm-pm8941-regulators" | ||||
| 		    "qcom,rpm-pm8994-regulators" | ||||
| 		    "qcom,rpm-pma8084-regulators" | ||||
| 
 | ||||
| - vdd_s1-supply: | ||||
|  | @ -68,6 +69,56 @@ Regulator nodes are identified by their compatible: | |||
| 	Definition: reference to regulator supplying the input pin, as | ||||
| 		    described in the data sheet | ||||
| 
 | ||||
| - vdd_s1-supply: | ||||
| - vdd_s2-supply: | ||||
| - vdd_s3-supply: | ||||
| - vdd_s4-supply: | ||||
| - vdd_s5-supply: | ||||
| - vdd_s6-supply: | ||||
| - vdd_s7-supply: | ||||
| - vdd_s8-supply: | ||||
| - vdd_s9-supply: | ||||
| - vdd_s10-supply: | ||||
| - vdd_s11-supply: | ||||
| - vdd_s12-supply: | ||||
| - vdd_l1-supply: | ||||
| - vdd_l2_l26_l28-supply: | ||||
| - vdd_l3_l11-supply: | ||||
| - vdd_l4_l27_l31-supply: | ||||
| - vdd_l5_l7-supply: | ||||
| - vdd_l6_l12_l32-supply: | ||||
| - vdd_l5_l7-supply: | ||||
| - vdd_l8_l16_l30-supply: | ||||
| - vdd_l9_l10_l18_l22-supply: | ||||
| - vdd_l9_l10_l18_l22-supply: | ||||
| - vdd_l3_l11-supply: | ||||
| - vdd_l6_l12_l32-supply: | ||||
| - vdd_l13_l19_l23_l24-supply: | ||||
| - vdd_l14_l15-supply: | ||||
| - vdd_l14_l15-supply: | ||||
| - vdd_l8_l16_l30-supply: | ||||
| - vdd_l17_l29-supply: | ||||
| - vdd_l9_l10_l18_l22-supply: | ||||
| - vdd_l13_l19_l23_l24-supply: | ||||
| - vdd_l20_l21-supply: | ||||
| - vdd_l20_l21-supply: | ||||
| - vdd_l9_l10_l18_l22-supply: | ||||
| - vdd_l13_l19_l23_l24-supply: | ||||
| - vdd_l13_l19_l23_l24-supply: | ||||
| - vdd_l25-supply: | ||||
| - vdd_l2_l26_l28-supply: | ||||
| - vdd_l4_l27_l31-supply: | ||||
| - vdd_l2_l26_l28-supply: | ||||
| - vdd_l17_l29-supply: | ||||
| - vdd_l8_l16_l30-supply: | ||||
| - vdd_l4_l27_l31-supply: | ||||
| - vdd_l6_l12_l32-supply: | ||||
| - vdd_lvs1_2-supply: | ||||
| 	Usage: optional (pm8994 only) | ||||
| 	Value type: <phandle> | ||||
| 	Definition: reference to regulator supplying the input pin, as | ||||
| 		    described in the data sheet | ||||
| 
 | ||||
| - vdd_s1-supply: | ||||
| - vdd_s2-supply: | ||||
| - vdd_s3-supply: | ||||
|  | @ -113,6 +164,11 @@ pm8941: | |||
| 	l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, lvs1, lvs2, | ||||
| 	lvs3, 5vs1, 5vs2 | ||||
| 
 | ||||
| pm8994: | ||||
| 	s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, l1, l2, l3, l4, l5, | ||||
| 	l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, | ||||
| 	l21, l22, l23, l24, l25, l26, l27, l28, l29, l30, l31, l32, lvs1, lvs2 | ||||
| 
 | ||||
| pma8084: | ||||
| 	s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, l1, l2, l3, l4, l5, | ||||
| 	l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, | ||||
|  |  | |||
							
								
								
									
										29
									
								
								Documentation/devicetree/bindings/spi/spi-lantiq-ssc.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								Documentation/devicetree/bindings/spi/spi-lantiq-ssc.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| Lantiq Synchronous Serial Controller (SSC) SPI master driver | ||||
| 
 | ||||
| Required properties: | ||||
| - compatible: "lantiq,ase-spi", "lantiq,falcon-spi", "lantiq,xrx100-spi" | ||||
| - #address-cells: see spi-bus.txt | ||||
| - #size-cells: see spi-bus.txt | ||||
| - reg: address and length of the spi master registers | ||||
| - interrupts: should contain the "spi_rx", "spi_tx" and "spi_err" interrupt. | ||||
| 
 | ||||
| 
 | ||||
| Optional properties: | ||||
| - clocks: spi clock phandle | ||||
| - num-cs: see spi-bus.txt, set to 8 if unset | ||||
| - base-cs: the number of the first chip select, set to 1 if unset. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| 
 | ||||
| spi: spi@E100800 { | ||||
| 	compatible = "lantiq,xrx200-spi", "lantiq,xrx100-spi"; | ||||
| 	reg = <0xE100800 0x100>; | ||||
| 	interrupt-parent = <&icu0>; | ||||
| 	interrupts = <22 23 24>; | ||||
| 	interrupt-names = "spi_rx", "spi_tx", "spi_err"; | ||||
| 	#address-cells = <1>; | ||||
| 	#size-cells = <1>; | ||||
| 	num-cs = <6>; | ||||
| 	base-cs = <1>; | ||||
| }; | ||||
|  | @ -31,6 +31,10 @@ Optional Properties: | |||
| - rx-sample-delay-ns: nanoseconds to delay after the SCLK edge before sampling | ||||
| 		Rx data (may need to be fine tuned for high capacitance lines). | ||||
| 		No delay (0) by default. | ||||
| - pinctrl-names: Names for the pin configuration(s); may be "default" or | ||||
| 		"sleep", where the "sleep" configuration may describe the state | ||||
| 		the pins should be in during system suspend. See also | ||||
| 		pinctrl/pinctrl-bindings.txt. | ||||
| 
 | ||||
| 
 | ||||
| Example: | ||||
|  | @ -46,4 +50,7 @@ Example: | |||
| 		interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 		clocks = <&cru SCLK_SPI0>, <&cru PCLK_SPI0>; | ||||
| 		clock-names = "spiclk", "apb_pclk"; | ||||
| 		pinctrl-0 = <&spi1_pins>; | ||||
| 		pinctrl-1 = <&spi1_sleep>; | ||||
| 		pinctrl-names = "default", "sleep"; | ||||
| 	}; | ||||
|  |  | |||
|  | @ -146,10 +146,11 @@ a pull-up resistor is needed on the outgoing rail to complete the circuit, and | |||
| in the second case, a pull-down resistor is needed on the rail. | ||||
| 
 | ||||
| Hardware that supports open drain or open source or both, can implement a | ||||
| special callback in the gpio_chip: .set_single_ended() that takes an enum flag | ||||
| telling whether to configure the line as open drain, open source or push-pull. | ||||
| This will happen in response to the GPIO_OPEN_DRAIN or GPIO_OPEN_SOURCE flag | ||||
| set in the machine file, or coming from other hardware descriptions. | ||||
| special callback in the gpio_chip: .set_config() that takes a generic | ||||
| pinconf packed value telling whether to configure the line as open drain, | ||||
| open source or push-pull. This will happen in response to the | ||||
| GPIO_OPEN_DRAIN or GPIO_OPEN_SOURCE flag set in the machine file, or coming | ||||
| from other hardware descriptions. | ||||
| 
 | ||||
| If this state can not be configured in hardware, i.e. if the GPIO hardware does | ||||
| not support open drain/open source in hardware, the GPIO library will instead | ||||
|  |  | |||
|  | @ -65,6 +65,21 @@ LED subsystem core exposes following API for setting brightness: | |||
| 		blinking, returns -EBUSY if software blink fallback is enabled. | ||||
| 
 | ||||
| 
 | ||||
| LED registration API | ||||
| ==================== | ||||
| 
 | ||||
| A driver wanting to register a LED classdev for use by other drivers / | ||||
| userspace needs to allocate and fill a led_classdev struct and then call | ||||
| [devm_]led_classdev_register. If the non devm version is used the driver | ||||
| must call led_classdev_unregister from its remove function before | ||||
| free-ing the led_classdev struct. | ||||
| 
 | ||||
| If the driver can detect hardware initiated brightness changes and thus | ||||
| wants to have a brightness_hw_changed attribute then the LED_BRIGHT_HW_CHANGED | ||||
| flag must be set in flags before registering. Calling | ||||
| led_classdev_notify_brightness_hw_changed on a classdev not registered with | ||||
| the LED_BRIGHT_HW_CHANGED flag is a bug and will trigger a WARN_ON. | ||||
| 
 | ||||
| Hardware accelerated blink of LEDs | ||||
| ================================== | ||||
| 
 | ||||
|  |  | |||
|  | @ -162,13 +162,13 @@ framework provides a depth-first graph traversal API for that purpose. | |||
|    currently defined as 16. | ||||
| 
 | ||||
| Drivers initiate a graph traversal by calling | ||||
| :c:func:`media_entity_graph_walk_start()` | ||||
| :c:func:`media_graph_walk_start()` | ||||
| 
 | ||||
| The graph structure, provided by the caller, is initialized to start graph | ||||
| traversal at the given entity. | ||||
| 
 | ||||
| Drivers can then retrieve the next entity by calling | ||||
| :c:func:`media_entity_graph_walk_next()` | ||||
| :c:func:`media_graph_walk_next()` | ||||
| 
 | ||||
| When the graph traversal is complete the function will return ``NULL``. | ||||
| 
 | ||||
|  | @ -206,7 +206,7 @@ Pipelines and media streams | |||
| 
 | ||||
| When starting streaming, drivers must notify all entities in the pipeline to | ||||
| prevent link states from being modified during streaming by calling | ||||
| :c:func:`media_entity_pipeline_start()`. | ||||
| :c:func:`media_pipeline_start()`. | ||||
| 
 | ||||
| The function will mark all entities connected to the given entity through | ||||
| enabled links, either directly or indirectly, as streaming. | ||||
|  | @ -218,17 +218,17 @@ in higher-level pipeline structures and can then access the | |||
| pipeline through the struct :c:type:`media_entity` | ||||
| pipe field. | ||||
| 
 | ||||
| Calls to :c:func:`media_entity_pipeline_start()` can be nested. | ||||
| Calls to :c:func:`media_pipeline_start()` can be nested. | ||||
| The pipeline pointer must be identical for all nested calls to the function. | ||||
| 
 | ||||
| :c:func:`media_entity_pipeline_start()` may return an error. In that case, | ||||
| :c:func:`media_pipeline_start()` may return an error. In that case, | ||||
| it will clean up any of the changes it did by itself. | ||||
| 
 | ||||
| When stopping the stream, drivers must notify the entities with | ||||
| :c:func:`media_entity_pipeline_stop()`. | ||||
| :c:func:`media_pipeline_stop()`. | ||||
| 
 | ||||
| If multiple calls to :c:func:`media_entity_pipeline_start()` have been | ||||
| made the same number of :c:func:`media_entity_pipeline_stop()` calls | ||||
| If multiple calls to :c:func:`media_pipeline_start()` have been | ||||
| made the same number of :c:func:`media_pipeline_stop()` calls | ||||
| are required to stop streaming. | ||||
| The :c:type:`media_entity`.\ ``pipe`` field is reset to ``NULL`` on the last | ||||
| nested stop call. | ||||
|  | @ -245,7 +245,7 @@ operation must be done with the media_device graph_mutex held. | |||
| Link validation | ||||
| ^^^^^^^^^^^^^^^ | ||||
| 
 | ||||
| Link validation is performed by :c:func:`media_entity_pipeline_start()` | ||||
| Link validation is performed by :c:func:`media_pipeline_start()` | ||||
| for any entity which has sink pads in the pipeline. The | ||||
| :c:type:`media_entity`.\ ``link_validate()`` callback is used for that | ||||
| purpose. In ``link_validate()`` callback, entity driver should check | ||||
|  |  | |||
|  | @ -94,9 +94,17 @@ Generic Error Codes | |||
|        -  Permission denied. Can be returned if the device needs write | ||||
| 	  permission, or some special capabilities is needed (e. g. root) | ||||
| 
 | ||||
|     -  .. row 11 | ||||
| 
 | ||||
|        -  ``EIO`` | ||||
| 
 | ||||
|        -  I/O error. Typically used when there are problems communicating with | ||||
|           a hardware device. This could indicate broken or flaky hardware. | ||||
| 	  It's a 'Something is wrong, I give up!' type of error. | ||||
| 
 | ||||
| .. note:: | ||||
| 
 | ||||
|   #. This list is not exaustive; ioctls may return other error codes. | ||||
|   #. This list is not exhaustive; ioctls may return other error codes. | ||||
|      Since errors may have side effects such as a driver reset, | ||||
|      applications should abort on unexpected errors, or otherwise | ||||
|      assume that the device is in a bad state. | ||||
|  |  | |||
|  | @ -92,15 +92,16 @@ This value may be reset to 0 if the current protocol is altered. | |||
| Reading this file returns a list of available protocols to use for the | ||||
| wakeup filter, something like: | ||||
| 
 | ||||
| ``rc5 rc6 nec jvc [sony]`` | ||||
| ``rc-5 nec nec-x rc-6-0 rc-6-6a-24 [rc-6-6a-32] rc-6-mce`` | ||||
| 
 | ||||
| Note that protocol variants are listed, so "nec", "sony", "rc-5", "rc-6" | ||||
| have their different bit length encodings listed if available. | ||||
| 
 | ||||
| Note that all protocol variants are listed. | ||||
| 
 | ||||
| The enabled wakeup protocol is shown in [] brackets. | ||||
| 
 | ||||
| Writing "+proto" will add a protocol to the list of enabled wakeup | ||||
| protocols. | ||||
| 
 | ||||
| Writing "-proto" will remove a protocol from the list of enabled wakeup | ||||
| protocols. | ||||
| Only one protocol can be selected at a time. | ||||
| 
 | ||||
| Writing "proto" will use "proto" for wakeup events. | ||||
| 
 | ||||
|  |  | |||
|  | @ -79,9 +79,7 @@ int __init foo_probe(void) | |||
| { | ||||
| 	struct pinctrl_dev *pctl; | ||||
| 
 | ||||
| 	pctl = pinctrl_register(&foo_desc, <PARENT>, NULL); | ||||
| 	if (!pctl) | ||||
| 		pr_err("could not register foo pin driver\n"); | ||||
| 	return pinctrl_register_and_init(&foo_desc, <PARENT>, NULL, &pctl); | ||||
| } | ||||
| 
 | ||||
| To enable the pinctrl subsystem and the subgroups for PINMUX and PINCONF and | ||||
|  |  | |||
|  | @ -79,22 +79,6 @@ dependent subsystems such as cpufreq are left to the discretion of the SoC | |||
| specific framework which uses the OPP library. Similar care needs to be taken | ||||
| care to refresh the cpufreq table in cases of these operations. | ||||
| 
 | ||||
| WARNING on OPP List locking mechanism: | ||||
| ------------------------------------------------- | ||||
| OPP library uses RCU for exclusivity. RCU allows the query functions to operate | ||||
| in multiple contexts and this synchronization mechanism is optimal for a read | ||||
| intensive operations on data structure as the OPP library caters to. | ||||
| 
 | ||||
| To ensure that the data retrieved are sane, the users such as SoC framework | ||||
| should ensure that the section of code operating on OPP queries are locked | ||||
| using RCU read locks. The opp_find_freq_{exact,ceil,floor}, | ||||
| opp_get_{voltage, freq, opp_count} fall into this category. | ||||
| 
 | ||||
| opp_{add,enable,disable} are updaters which use mutex and implement it's own | ||||
| RCU locking mechanisms. These functions should *NOT* be called under RCU locks | ||||
| and other contexts that prevent blocking functions in RCU or mutex operations | ||||
| from working. | ||||
| 
 | ||||
| 2. Initial OPP List Registration | ||||
| ================================ | ||||
| The SoC implementation calls dev_pm_opp_add function iteratively to add OPPs per | ||||
|  | @ -137,15 +121,18 @@ functions return the matching pointer representing the opp if a match is | |||
| found, else returns error. These errors are expected to be handled by standard | ||||
| error checks such as IS_ERR() and appropriate actions taken by the caller. | ||||
| 
 | ||||
| Callers of these functions shall call dev_pm_opp_put() after they have used the | ||||
| OPP. Otherwise the memory for the OPP will never get freed and result in | ||||
| memleak. | ||||
| 
 | ||||
| dev_pm_opp_find_freq_exact - Search for an OPP based on an *exact* frequency and | ||||
| 	availability. This function is especially useful to enable an OPP which | ||||
| 	is not available by default. | ||||
| 	Example: In a case when SoC framework detects a situation where a | ||||
| 	higher frequency could be made available, it can use this function to | ||||
| 	find the OPP prior to call the dev_pm_opp_enable to actually make it available. | ||||
| 	 rcu_read_lock(); | ||||
| 	 opp = dev_pm_opp_find_freq_exact(dev, 1000000000, false); | ||||
| 	 rcu_read_unlock(); | ||||
| 	 dev_pm_opp_put(opp); | ||||
| 	 /* dont operate on the pointer.. just do a sanity check.. */ | ||||
| 	 if (IS_ERR(opp)) { | ||||
| 		pr_err("frequency not disabled!\n"); | ||||
|  | @ -163,9 +150,8 @@ dev_pm_opp_find_freq_floor - Search for an available OPP which is *at most* the | |||
| 	frequency. | ||||
| 	Example: To find the highest opp for a device: | ||||
| 	 freq = ULONG_MAX; | ||||
| 	 rcu_read_lock(); | ||||
| 	 dev_pm_opp_find_freq_floor(dev, &freq); | ||||
| 	 rcu_read_unlock(); | ||||
| 	 opp = dev_pm_opp_find_freq_floor(dev, &freq); | ||||
| 	 dev_pm_opp_put(opp); | ||||
| 
 | ||||
| dev_pm_opp_find_freq_ceil - Search for an available OPP which is *at least* the | ||||
| 	provided frequency. This function is useful while searching for a | ||||
|  | @ -173,17 +159,15 @@ dev_pm_opp_find_freq_ceil - Search for an available OPP which is *at least* the | |||
| 	frequency. | ||||
| 	Example 1: To find the lowest opp for a device: | ||||
| 	 freq = 0; | ||||
| 	 rcu_read_lock(); | ||||
| 	 dev_pm_opp_find_freq_ceil(dev, &freq); | ||||
| 	 rcu_read_unlock(); | ||||
| 	 opp = dev_pm_opp_find_freq_ceil(dev, &freq); | ||||
| 	 dev_pm_opp_put(opp); | ||||
| 	Example 2: A simplified implementation of a SoC cpufreq_driver->target: | ||||
| 	 soc_cpufreq_target(..) | ||||
| 	 { | ||||
| 		/* Do stuff like policy checks etc. */ | ||||
| 		/* Find the best frequency match for the req */ | ||||
| 		rcu_read_lock(); | ||||
| 		opp = dev_pm_opp_find_freq_ceil(dev, &freq); | ||||
| 		rcu_read_unlock(); | ||||
| 		dev_pm_opp_put(opp); | ||||
| 		if (!IS_ERR(opp)) | ||||
| 			soc_switch_to_freq_voltage(freq); | ||||
| 		else | ||||
|  | @ -208,9 +192,8 @@ dev_pm_opp_enable - Make a OPP available for operation. | |||
| 	implementation might choose to do something as follows: | ||||
| 	 if (cur_temp < temp_low_thresh) { | ||||
| 		/* Enable 1GHz if it was disabled */ | ||||
| 		rcu_read_lock(); | ||||
| 		opp = dev_pm_opp_find_freq_exact(dev, 1000000000, false); | ||||
| 		rcu_read_unlock(); | ||||
| 		dev_pm_opp_put(opp); | ||||
| 		/* just error check */ | ||||
| 		if (!IS_ERR(opp)) | ||||
| 			ret = dev_pm_opp_enable(dev, 1000000000); | ||||
|  | @ -224,9 +207,8 @@ dev_pm_opp_disable - Make an OPP to be not available for operation | |||
| 	choose to do something as follows: | ||||
| 	 if (cur_temp > temp_high_thresh) { | ||||
| 		/* Disable 1GHz if it was enabled */ | ||||
| 		rcu_read_lock(); | ||||
| 		opp = dev_pm_opp_find_freq_exact(dev, 1000000000, true); | ||||
| 		rcu_read_unlock(); | ||||
| 		dev_pm_opp_put(opp); | ||||
| 		/* just error check */ | ||||
| 		if (!IS_ERR(opp)) | ||||
| 			ret = dev_pm_opp_disable(dev, 1000000000); | ||||
|  | @ -249,10 +231,9 @@ dev_pm_opp_get_voltage - Retrieve the voltage represented by the opp pointer. | |||
| 	 soc_switch_to_freq_voltage(freq) | ||||
| 	 { | ||||
| 		/* do things */ | ||||
| 		rcu_read_lock(); | ||||
| 		opp = dev_pm_opp_find_freq_ceil(dev, &freq); | ||||
| 		v = dev_pm_opp_get_voltage(opp); | ||||
| 		rcu_read_unlock(); | ||||
| 		dev_pm_opp_put(opp); | ||||
| 		if (v) | ||||
| 			regulator_set_voltage(.., v); | ||||
| 		/* do other things */ | ||||
|  | @ -266,12 +247,12 @@ dev_pm_opp_get_freq - Retrieve the freq represented by the opp pointer. | |||
| 	 { | ||||
| 		/* do things.. */ | ||||
| 		 max_freq = ULONG_MAX; | ||||
| 		 rcu_read_lock(); | ||||
| 		 max_opp = dev_pm_opp_find_freq_floor(dev,&max_freq); | ||||
| 		 requested_opp = dev_pm_opp_find_freq_ceil(dev,&freq); | ||||
| 		 if (!IS_ERR(max_opp) && !IS_ERR(requested_opp)) | ||||
| 			r = soc_test_validity(max_opp, requested_opp); | ||||
| 		 rcu_read_unlock(); | ||||
| 		 dev_pm_opp_put(max_opp); | ||||
| 		 dev_pm_opp_put(requested_opp); | ||||
| 		/* do other things */ | ||||
| 	 } | ||||
| 	 soc_test_validity(..) | ||||
|  | @ -289,7 +270,6 @@ dev_pm_opp_get_opp_count - Retrieve the number of available opps for a device | |||
| 	 soc_notify_coproc_available_frequencies() | ||||
| 	 { | ||||
| 		/* Do things */ | ||||
| 		rcu_read_lock(); | ||||
| 		num_available = dev_pm_opp_get_opp_count(dev); | ||||
| 		speeds = kzalloc(sizeof(u32) * num_available, GFP_KERNEL); | ||||
| 		/* populate the table in increasing order */ | ||||
|  | @ -298,8 +278,8 @@ dev_pm_opp_get_opp_count - Retrieve the number of available opps for a device | |||
| 			speeds[i] = freq; | ||||
| 			freq++; | ||||
| 			i++; | ||||
| 			dev_pm_opp_put(opp); | ||||
| 		} | ||||
| 		rcu_read_unlock(); | ||||
| 
 | ||||
| 		soc_notify_coproc(AVAILABLE_FREQs, speeds, num_available); | ||||
| 		/* Do other things */ | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ to be used subsequently to change to the one represented by that string. | |||
| Consequently, there are two ways to cause the system to go into the | ||||
| Suspend-To-Idle sleep state.  The first one is to write "freeze" directly to | ||||
| /sys/power/state.  The second one is to write "s2idle" to /sys/power/mem_sleep | ||||
| and then to wrtie "mem" to /sys/power/state.  Similarly, there are two ways | ||||
| and then to write "mem" to /sys/power/state.  Similarly, there are two ways | ||||
| to cause the system to go into the Power-On Suspend sleep state (the strings to | ||||
| write to the control files in that case are "standby" or "shallow" and "mem", | ||||
| respectively) if that state is supported by the platform.  In turn, there is | ||||
|  |  | |||
|  | @ -22,6 +22,13 @@ system, building their checks on top of the defined capability hooks. | |||
| For more details on capabilities, see capabilities(7) in the Linux | ||||
| man-pages project. | ||||
| 
 | ||||
| A list of the active security modules can be found by reading | ||||
| /sys/kernel/security/lsm. This is a comma separated list, and | ||||
| will always include the capability module. The list reflects the | ||||
| order in which checks are made. The capability module will always | ||||
| be first, followed by any "minor" modules (e.g. Yama) and then | ||||
| the one "major" module (e.g. SELinux) if there is one configured. | ||||
| 
 | ||||
| Based on https://lkml.org/lkml/2007/10/26/215, | ||||
| a new LSM is accepted into the kernel when its intent (a description of | ||||
| what it tries to protect against and in what cases one would expect to | ||||
|  |  | |||
|  | @ -1,105 +0,0 @@ | |||
| Cirrus EP93xx SPI controller driver HOWTO | ||||
| ========================================= | ||||
| 
 | ||||
| ep93xx_spi driver brings SPI master support for EP93xx SPI controller.  Chip | ||||
| selects are implemented with GPIO lines. | ||||
| 
 | ||||
| NOTE: If possible, don't use SFRMOUT (SFRM1) signal as a chip select. It will | ||||
| not work correctly (it cannot be controlled by software). Use GPIO lines | ||||
| instead. | ||||
| 
 | ||||
| Sample configuration | ||||
| ==================== | ||||
| 
 | ||||
| Typically driver configuration is done in platform board files (the files under | ||||
| arch/arm/mach-ep93xx/*.c). In this example we configure MMC over SPI through | ||||
| this driver on TS-7260 board. You can adapt the code to suit your needs. | ||||
| 
 | ||||
| This example uses EGPIO9 as SD/MMC card chip select (this is wired in DIO1 | ||||
| header on the board). | ||||
| 
 | ||||
| You need to select CONFIG_MMC_SPI to use mmc_spi driver. | ||||
| 
 | ||||
| arch/arm/mach-ep93xx/ts72xx.c: | ||||
| 
 | ||||
| ... | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/spi/spi.h> | ||||
| 
 | ||||
| #include <linux/platform_data/spi-ep93xx.h> | ||||
| 
 | ||||
| /* this is our GPIO line used for chip select */ | ||||
| #define MMC_CHIP_SELECT_GPIO EP93XX_GPIO_LINE_EGPIO9 | ||||
| 
 | ||||
| static int ts72xx_mmc_spi_setup(struct spi_device *spi) | ||||
| { | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = gpio_request(MMC_CHIP_SELECT_GPIO, spi->modalias); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	gpio_direction_output(MMC_CHIP_SELECT_GPIO, 1); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void ts72xx_mmc_spi_cleanup(struct spi_device *spi) | ||||
| { | ||||
| 	gpio_set_value(MMC_CHIP_SELECT_GPIO, 1); | ||||
| 	gpio_direction_input(MMC_CHIP_SELECT_GPIO); | ||||
| 	gpio_free(MMC_CHIP_SELECT_GPIO); | ||||
| } | ||||
| 
 | ||||
| static void ts72xx_mmc_spi_cs_control(struct spi_device *spi, int value) | ||||
| { | ||||
| 	gpio_set_value(MMC_CHIP_SELECT_GPIO, value); | ||||
| } | ||||
| 
 | ||||
| static struct ep93xx_spi_chip_ops ts72xx_mmc_spi_ops = { | ||||
| 	.setup		= ts72xx_mmc_spi_setup, | ||||
| 	.cleanup	= ts72xx_mmc_spi_cleanup, | ||||
| 	.cs_control	= ts72xx_mmc_spi_cs_control, | ||||
| }; | ||||
| 
 | ||||
| static struct spi_board_info ts72xx_spi_devices[] __initdata = { | ||||
| 	{ | ||||
| 		.modalias		= "mmc_spi", | ||||
| 		.controller_data	= &ts72xx_mmc_spi_ops, | ||||
| 		/* | ||||
| 		 * We use 10 MHz even though the maximum is 7.4 MHz. The driver | ||||
| 		 * will limit it automatically to max. frequency. | ||||
| 		 */ | ||||
| 		.max_speed_hz		= 10 * 1000 * 1000, | ||||
| 		.bus_num		= 0, | ||||
| 		.chip_select		= 0, | ||||
| 		.mode			= SPI_MODE_0, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct ep93xx_spi_info ts72xx_spi_info = { | ||||
| 	.num_chipselect	= ARRAY_SIZE(ts72xx_spi_devices), | ||||
| }; | ||||
| 
 | ||||
| static void __init ts72xx_init_machine(void) | ||||
| { | ||||
| 	... | ||||
| 	ep93xx_register_spi(&ts72xx_spi_info, ts72xx_spi_devices, | ||||
| 			    ARRAY_SIZE(ts72xx_spi_devices)); | ||||
| } | ||||
| 
 | ||||
| The driver can use DMA for the transfers also. In this case ts72xx_spi_info | ||||
| becomes: | ||||
| 
 | ||||
| static struct ep93xx_spi_info ts72xx_spi_info = { | ||||
| 	.num_chipselect	= ARRAY_SIZE(ts72xx_spi_devices), | ||||
| 	.use_dma	= true; | ||||
| }; | ||||
| 
 | ||||
| Note that CONFIG_EP93XX_DMA should be enabled as well. | ||||
| 
 | ||||
| Thanks to | ||||
| ========= | ||||
| Martin Guy, H. Hartley Sweeten and others who helped me during development of | ||||
| the driver. Simplemachines.it donated me a Sim.One board which I used testing | ||||
| the driver on EP9307. | ||||
							
								
								
									
										85
									
								
								MAINTAINERS
									
										
									
									
									
								
							
							
						
						
									
										85
									
								
								MAINTAINERS
									
										
									
									
									
								
							|  | @ -2423,6 +2423,14 @@ W:	https://linuxtv.org | |||
| S:	Supported | ||||
| F:	drivers/media/platform/sti/bdisp | ||||
| 
 | ||||
| DELTA ST MEDIA DRIVER | ||||
| M:	Hugues Fruchet <hugues.fruchet@st.com> | ||||
| L:	linux-media@vger.kernel.org | ||||
| T:	git git://linuxtv.org/media_tree.git | ||||
| W:	https://linuxtv.org | ||||
| S:	Supported | ||||
| F:	drivers/media/platform/sti/delta | ||||
| 
 | ||||
| BEFS FILE SYSTEM | ||||
| M:	Luis de Bethencourt <luisbg@osg.samsung.com> | ||||
| M:	Salah Triki <salah.triki@gmail.com> | ||||
|  | @ -2692,6 +2700,13 @@ F:	drivers/irqchip/irq-brcmstb* | |||
| F:	include/linux/bcm963xx_nvram.h | ||||
| F:	include/linux/bcm963xx_tag.h | ||||
| 
 | ||||
| BROADCOM BMIPS CPUFREQ DRIVER | ||||
| M:	Markus Mayer <mmayer@broadcom.com> | ||||
| M:	bcm-kernel-feedback-list@broadcom.com | ||||
| L:	linux-pm@vger.kernel.org | ||||
| S:	Maintained | ||||
| F:	drivers/cpufreq/bmips-cpufreq.c | ||||
| 
 | ||||
| BROADCOM TG3 GIGABIT ETHERNET DRIVER | ||||
| M:	Siva Reddy Kallam <siva.kallam@broadcom.com> | ||||
| M:	Prashant Sreedharan <prashant@broadcom.com> | ||||
|  | @ -5274,7 +5289,7 @@ M:	Jaegeuk Kim <jaegeuk@kernel.org> | |||
| L:	linux-fsdevel@vger.kernel.org | ||||
| S:	Supported | ||||
| F:	fs/crypto/ | ||||
| F:	include/linux/fscrypto.h | ||||
| F:	include/linux/fscrypt*.h | ||||
| 
 | ||||
| F2FS FILE SYSTEM | ||||
| M:	Jaegeuk Kim <jaegeuk@kernel.org> | ||||
|  | @ -5731,16 +5746,6 @@ L:	linux-parisc@vger.kernel.org | |||
| S:	Maintained | ||||
| F:	sound/parisc/harmony.* | ||||
| 
 | ||||
| HD29L2 MEDIA DRIVER | ||||
| M:	Antti Palosaari <crope@iki.fi> | ||||
| L:	linux-media@vger.kernel.org | ||||
| W:	https://linuxtv.org | ||||
| W:	http://palosaari.fi/linux/ | ||||
| Q:	http://patchwork.linuxtv.org/project/linux-media/list/ | ||||
| T:	git git://linuxtv.org/anttip/media_tree.git | ||||
| S:	Maintained | ||||
| F:	drivers/media/dvb-frontends/hd29l2* | ||||
| 
 | ||||
| HEWLETT PACKARD ENTERPRISE ILO NMI WATCHDOG DRIVER | ||||
| M:	Jimmy Vance <jimmy.vance@hpe.com> | ||||
| S:	Supported | ||||
|  | @ -7700,6 +7705,12 @@ W:	http://www.kernel.org/doc/man-pages | |||
| L:	linux-man@vger.kernel.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| MARDUK (CREATOR CI40) DEVICE TREE SUPPORT | ||||
| M:	Rahul Bedarkar <rahul.bedarkar@imgtec.com> | ||||
| L:	linux-mips@linux-mips.org | ||||
| S:	Maintained | ||||
| F:	arch/mips/boot/dts/img/pistachio_marduk.dts | ||||
| 
 | ||||
| MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER | ||||
| M:	Andrew Lunn <andrew@lunn.ch> | ||||
| M:	Vivien Didelot <vivien.didelot@savoirfairelinux.com> | ||||
|  | @ -8613,10 +8624,10 @@ S:	Maintained | |||
| F:	drivers/net/ethernet/netronome/ | ||||
| 
 | ||||
| NETWORK BLOCK DEVICE (NBD) | ||||
| M:	Markus Pargmann <mpa@pengutronix.de> | ||||
| M:	Josef Bacik <jbacik@fb.com> | ||||
| S:	Maintained | ||||
| L:	linux-block@vger.kernel.org | ||||
| L:	nbd-general@lists.sourceforge.net | ||||
| T:	git git://git.pengutronix.de/git/mpa/linux-nbd.git | ||||
| F:	Documentation/blockdev/nbd.txt | ||||
| F:	drivers/block/nbd.c | ||||
| F:	include/uapi/linux/nbd.h | ||||
|  | @ -8812,6 +8823,22 @@ T:	git git://git.kernel.org/pub/scm/linux/kernel/git/lftan/nios2.git | |||
| S:	Maintained | ||||
| F:	arch/nios2/ | ||||
| 
 | ||||
| NOKIA N900 CAMERA SUPPORT (ET8EK8 SENSOR, AD5820 FOCUS) | ||||
| M:	Pavel Machek <pavel@ucw.cz> | ||||
| M:	Sakari Ailus <sakari.ailus@iki.fi> | ||||
| L:	linux-media@vger.kernel.org | ||||
| S:	Maintained | ||||
| F:	drivers/media/i2c/et8ek8 | ||||
| F:	drivers/media/i2c/ad5820.c | ||||
| 
 | ||||
| NOKIA N900 CAMERA SUPPORT (ET8EK8 SENSOR, AD5820 FOCUS) | ||||
| M:	Pavel Machek <pavel@ucw.cz> | ||||
| M:	Sakari Ailus <sakari.ailus@iki.fi> | ||||
| L:	linux-media@vger.kernel.org | ||||
| S:	Maintained | ||||
| F:	drivers/media/i2c/et8ek8 | ||||
| F:	drivers/media/i2c/ad5820.c | ||||
| 
 | ||||
| NOKIA N900 POWER SUPPLY DRIVERS | ||||
| R:	Pali Rohár <pali.rohar@gmail.com> | ||||
| F:	include/linux/power/bq2415x_charger.h | ||||
|  | @ -9788,7 +9815,7 @@ L:      linux-mips@linux-mips.org | |||
| S:      Maintained | ||||
| F:      arch/mips/pistachio/ | ||||
| F:      arch/mips/include/asm/mach-pistachio/ | ||||
| F:      arch/mips/boot/dts/pistachio/ | ||||
| F:      arch/mips/boot/dts/img/pistachio* | ||||
| F:      arch/mips/configs/pistachio*_defconfig | ||||
| 
 | ||||
| PKTCDVD DRIVER | ||||
|  | @ -10887,7 +10914,6 @@ SYNOPSYS DESIGNWARE MMC/SD/SDIO DRIVER | |||
| M:	Jaehoon Chung <jh80.chung@samsung.com> | ||||
| L:	linux-mmc@vger.kernel.org | ||||
| S:	Maintained | ||||
| F:	include/linux/mmc/dw_mmc.h | ||||
| F:	drivers/mmc/host/dw_mmc* | ||||
| 
 | ||||
| SYSTEM TRACE MODULE CLASS | ||||
|  | @ -11090,6 +11116,17 @@ L:	linux-mmc@vger.kernel.org | |||
| S:	Maintained | ||||
| F:	drivers/mmc/host/sdhci-spear.c | ||||
| 
 | ||||
| SECURE ENCRYPTING DEVICE (SED) OPAL DRIVER | ||||
| M:	Scott Bauer <scott.bauer@intel.com> | ||||
| M:	Jonathan Derrick <jonathan.derrick@intel.com> | ||||
| M:	Rafael Antognolli <rafael.antognolli@intel.com> | ||||
| L:	linux-block@vger.kernel.org | ||||
| S:	Supported | ||||
| F:	block/sed* | ||||
| F:	block/opal_proto.h | ||||
| F:	include/linux/sed* | ||||
| F:	include/uapi/linux/sed* | ||||
| 
 | ||||
| SECURITY SUBSYSTEM | ||||
| M:	James Morris <james.l.morris@oracle.com> | ||||
| M:	"Serge E. Hallyn" <serge@hallyn.com> | ||||
|  | @ -13637,6 +13674,24 @@ L:	zd1211-devs@lists.sourceforge.net (subscribers-only) | |||
| S:	Maintained | ||||
| F:	drivers/net/wireless/zydas/zd1211rw/ | ||||
| 
 | ||||
| ZD1301_DEMOD MEDIA DRIVER | ||||
| M:	Antti Palosaari <crope@iki.fi> | ||||
| L:	linux-media@vger.kernel.org | ||||
| W:	https://linuxtv.org/ | ||||
| W:	http://palosaari.fi/linux/ | ||||
| Q:	https://patchwork.linuxtv.org/project/linux-media/list/ | ||||
| S:	Maintained | ||||
| F:	drivers/media/dvb-frontends/zd1301_demod* | ||||
| 
 | ||||
| ZD1301 MEDIA DRIVER | ||||
| M:	Antti Palosaari <crope@iki.fi> | ||||
| L:	linux-media@vger.kernel.org | ||||
| W:	https://linuxtv.org/ | ||||
| W:	http://palosaari.fi/linux/ | ||||
| Q:	https://patchwork.linuxtv.org/project/linux-media/list/ | ||||
| S:	Maintained | ||||
| F:	drivers/media/usb/dvb-usb-v2/zd1301* | ||||
| 
 | ||||
| ZPOOL COMPRESSED PAGE STORAGE API | ||||
| M:	Dan Streetman <ddstreet@ieee.org> | ||||
| L:	linux-mm@kvack.org | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ | |||
| #include <linux/sched.h> | ||||
| #include <linux/tty.h> | ||||
| #include <linux/delay.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/extable.h> | ||||
| #include <linux/kallsyms.h> | ||||
| #include <linux/ratelimit.h> | ||||
| 
 | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ | |||
| #include <linux/mman.h> | ||||
| #include <linux/smp.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/extable.h> | ||||
| #include <linux/uaccess.h> | ||||
| 
 | ||||
| extern void die_if_kernel(char *,struct pt_regs *,long, unsigned long *); | ||||
|  |  | |||
|  | @ -8,7 +8,8 @@ | |||
|  * Borrowed heavily from MIPS | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/export.h> | ||||
| #include <linux/extable.h> | ||||
| #include <linux/uaccess.h> | ||||
| 
 | ||||
| int fixup_exception(struct pt_regs *regs) | ||||
|  |  | |||
|  | @ -1166,8 +1166,10 @@ | |||
| 			}; | ||||
| 
 | ||||
| 			vdoa@021e4000 { | ||||
| 				compatible = "fsl,imx6q-vdoa"; | ||||
| 				reg = <0x021e4000 0x4000>; | ||||
| 				interrupts = <0 18 IRQ_TYPE_LEVEL_HIGH>; | ||||
| 				clocks = <&clks IMX6QDL_CLK_VDOA>; | ||||
| 			}; | ||||
| 
 | ||||
| 			uart2: serial@021e8000 { | ||||
|  |  | |||
|  | @ -1003,5 +1003,15 @@ | |||
| 
 | ||||
| 			status = "disabled"; | ||||
| 		}; | ||||
| 
 | ||||
| 		delta0 { | ||||
| 			compatible = "st,st-delta"; | ||||
| 			clock-names = "delta", | ||||
| 				      "delta-st231", | ||||
| 				      "delta-flash-promip"; | ||||
| 			clocks = <&clk_s_c0_flexgen CLK_VID_DMU>, | ||||
| 				 <&clk_s_c0_flexgen CLK_ST231_DMU>, | ||||
| 				 <&clk_s_c0_flexgen CLK_FLASH_PROMIP>; | ||||
| 		}; | ||||
| 	}; | ||||
| }; | ||||
|  |  | |||
|  | @ -24,7 +24,7 @@ CONFIG_ARM_APPENDED_DTB=y | |||
| CONFIG_ARM_ATAG_DTB_COMPAT=y | ||||
| CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M" | ||||
| CONFIG_CPU_FREQ=y | ||||
| CONFIG_CPU_FREQ_STAT_DETAILS=y | ||||
| CONFIG_CPU_FREQ_STAT=y | ||||
| CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | ||||
| CONFIG_CPU_FREQ_GOV_POWERSAVE=m | ||||
| CONFIG_CPU_FREQ_GOV_USERSPACE=m | ||||
|  |  | |||
|  | @ -58,7 +58,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0 | |||
| CONFIG_ARM_APPENDED_DTB=y | ||||
| CONFIG_ARM_ATAG_DTB_COMPAT=y | ||||
| CONFIG_CPU_FREQ=y | ||||
| CONFIG_CPU_FREQ_STAT_DETAILS=y | ||||
| CONFIG_CPU_FREQ_STAT=y | ||||
| CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | ||||
| CONFIG_CPU_IDLE=y | ||||
| CONFIG_ARM_KIRKWOOD_CPUIDLE=y | ||||
|  |  | |||
|  | @ -132,7 +132,7 @@ CONFIG_ARM_ATAG_DTB_COMPAT=y | |||
| CONFIG_KEXEC=y | ||||
| CONFIG_EFI=y | ||||
| CONFIG_CPU_FREQ=y | ||||
| CONFIG_CPU_FREQ_STAT_DETAILS=y | ||||
| CONFIG_CPU_FREQ_STAT=y | ||||
| CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | ||||
| CONFIG_CPU_FREQ_GOV_POWERSAVE=m | ||||
| CONFIG_CPU_FREQ_GOV_USERSPACE=m | ||||
|  | @ -569,6 +569,7 @@ CONFIG_VIDEO_SAMSUNG_S5P_MFC=m | |||
| CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC=m | ||||
| CONFIG_VIDEO_STI_BDISP=m | ||||
| CONFIG_VIDEO_STI_HVA=m | ||||
| CONFIG_VIDEO_STI_DELTA=m | ||||
| CONFIG_VIDEO_RENESAS_JPU=m | ||||
| CONFIG_VIDEO_RENESAS_VSP1=m | ||||
| CONFIG_V4L_TEST_DRIVERS=y | ||||
|  |  | |||
|  | @ -44,7 +44,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0 | |||
| CONFIG_ARM_APPENDED_DTB=y | ||||
| CONFIG_ARM_ATAG_DTB_COMPAT=y | ||||
| CONFIG_CPU_FREQ=y | ||||
| CONFIG_CPU_FREQ_STAT_DETAILS=y | ||||
| CONFIG_CPU_FREQ_STAT=y | ||||
| CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | ||||
| CONFIG_CPU_IDLE=y | ||||
| CONFIG_ARM_KIRKWOOD_CPUIDLE=y | ||||
|  |  | |||
|  | @ -97,7 +97,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0 | |||
| CONFIG_CMDLINE="root=/dev/ram0 ro" | ||||
| CONFIG_KEXEC=y | ||||
| CONFIG_CPU_FREQ=y | ||||
| CONFIG_CPU_FREQ_STAT_DETAILS=y | ||||
| CONFIG_CPU_FREQ_STAT=y | ||||
| CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | ||||
| CONFIG_CPU_FREQ_GOV_POWERSAVE=m | ||||
| CONFIG_CPU_FREQ_GOV_USERSPACE=m | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0 | |||
| CONFIG_ARM_APPENDED_DTB=y | ||||
| CONFIG_KEXEC=y | ||||
| CONFIG_CPU_FREQ=y | ||||
| CONFIG_CPU_FREQ_STAT_DETAILS=y | ||||
| CONFIG_CPU_FREQ_STAT=y | ||||
| CONFIG_CPU_FREQ_GOV_POWERSAVE=y | ||||
| CONFIG_CPU_FREQ_GOV_USERSPACE=y | ||||
| CONFIG_CPU_FREQ_GOV_ONDEMAND=y | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ | |||
| #include <linux/gpio/machine.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/leds.h> | ||||
| #include <linux/i2c.h> | ||||
| #include <linux/platform_data/at24.h> | ||||
| #include <linux/platform_data/pca953x.h> | ||||
|  |  | |||
|  | @ -25,6 +25,7 @@ | |||
| #include <linux/videodev2.h> | ||||
| #include <linux/v4l2-dv-timings.h> | ||||
| #include <linux/export.h> | ||||
| #include <linux/leds.h> | ||||
| 
 | ||||
| #include <media/i2c/tvp514x.h> | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,6 +25,7 @@ | |||
|  */ | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/leds.h> | ||||
| #include <linux/mtd/partitions.h> | ||||
| #include <linux/platform_data/gpio-davinci.h> | ||||
| #include <linux/platform_data/i2c-davinci.h> | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ | |||
| #include <linux/kernel.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/console.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/gpio/machine.h> | ||||
| #include <linux/platform_data/gpio-davinci.h> | ||||
|  |  | |||
|  | @ -27,7 +27,6 @@ | |||
| #include <linux/kernel.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/i2c.h> | ||||
| #include <linux/i2c-gpio.h> | ||||
| #include <linux/spi/spi.h> | ||||
|  | @ -106,33 +105,10 @@ static struct cs4271_platform_data edb93xx_cs4271_data = { | |||
| 	.gpio_nreset	= -EINVAL,	/* filled in later */ | ||||
| }; | ||||
| 
 | ||||
| static int edb93xx_cs4271_hw_setup(struct spi_device *spi) | ||||
| { | ||||
| 	return gpio_request_one(EP93XX_GPIO_LINE_EGPIO6, | ||||
| 				GPIOF_OUT_INIT_HIGH, spi->modalias); | ||||
| } | ||||
| 
 | ||||
| static void edb93xx_cs4271_hw_cleanup(struct spi_device *spi) | ||||
| { | ||||
| 	gpio_free(EP93XX_GPIO_LINE_EGPIO6); | ||||
| } | ||||
| 
 | ||||
| static void edb93xx_cs4271_hw_cs_control(struct spi_device *spi, int value) | ||||
| { | ||||
| 	gpio_set_value(EP93XX_GPIO_LINE_EGPIO6, value); | ||||
| } | ||||
| 
 | ||||
| static struct ep93xx_spi_chip_ops edb93xx_cs4271_hw = { | ||||
| 	.setup		= edb93xx_cs4271_hw_setup, | ||||
| 	.cleanup	= edb93xx_cs4271_hw_cleanup, | ||||
| 	.cs_control	= edb93xx_cs4271_hw_cs_control, | ||||
| }; | ||||
| 
 | ||||
| static struct spi_board_info edb93xx_spi_board_info[] __initdata = { | ||||
| 	{ | ||||
| 		.modalias		= "cs4271", | ||||
| 		.platform_data		= &edb93xx_cs4271_data, | ||||
| 		.controller_data	= &edb93xx_cs4271_hw, | ||||
| 		.max_speed_hz		= 6000000, | ||||
| 		.bus_num		= 0, | ||||
| 		.chip_select		= 0, | ||||
|  | @ -140,8 +116,13 @@ static struct spi_board_info edb93xx_spi_board_info[] __initdata = { | |||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int edb93xx_spi_chipselects[] __initdata = { | ||||
| 	EP93XX_GPIO_LINE_EGPIO6, | ||||
| }; | ||||
| 
 | ||||
| static struct ep93xx_spi_info edb93xx_spi_info __initdata = { | ||||
| 	.num_chipselect	= ARRAY_SIZE(edb93xx_spi_board_info), | ||||
| 	.chipselect	= edb93xx_spi_chipselects, | ||||
| 	.num_chipselect	= ARRAY_SIZE(edb93xx_spi_chipselects), | ||||
| }; | ||||
| 
 | ||||
| static void __init edb93xx_register_spi(void) | ||||
|  |  | |||
|  | @ -48,56 +48,6 @@ static struct ep93xxfb_mach_info __initdata simone_fb_info = { | |||
|  */ | ||||
| #define MMC_CARD_DETECT_GPIO EP93XX_GPIO_LINE_EGPIO0 | ||||
| 
 | ||||
| /*
 | ||||
|  * Up to v1.3, the Sim.One used SFRMOUT as SD card chip select, but this goes | ||||
|  * low between multi-message command blocks. From v1.4, it uses a GPIO instead. | ||||
|  * v1.3 parts will still work, since the signal on SFRMOUT is automatic. | ||||
|  */ | ||||
| #define MMC_CHIP_SELECT_GPIO EP93XX_GPIO_LINE_EGPIO1 | ||||
| 
 | ||||
| /*
 | ||||
|  * MMC SPI chip select GPIO handling. If you are using SFRMOUT (SFRM1) signal, | ||||
|  * you can leave these empty and pass NULL as .controller_data. | ||||
|  */ | ||||
| 
 | ||||
| static int simone_mmc_spi_setup(struct spi_device *spi) | ||||
| { | ||||
| 	unsigned int gpio = MMC_CHIP_SELECT_GPIO; | ||||
| 	int err; | ||||
| 
 | ||||
| 	err = gpio_request(gpio, spi->modalias); | ||||
| 	if (err) | ||||
| 		return err; | ||||
| 
 | ||||
| 	err = gpio_direction_output(gpio, 1); | ||||
| 	if (err) { | ||||
| 		gpio_free(gpio); | ||||
| 		return err; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void simone_mmc_spi_cleanup(struct spi_device *spi) | ||||
| { | ||||
| 	unsigned int gpio = MMC_CHIP_SELECT_GPIO; | ||||
| 
 | ||||
| 	gpio_set_value(gpio, 1); | ||||
| 	gpio_direction_input(gpio); | ||||
| 	gpio_free(gpio); | ||||
| } | ||||
| 
 | ||||
| static void simone_mmc_spi_cs_control(struct spi_device *spi, int value) | ||||
| { | ||||
| 	gpio_set_value(MMC_CHIP_SELECT_GPIO, value); | ||||
| } | ||||
| 
 | ||||
| static struct ep93xx_spi_chip_ops simone_mmc_spi_ops = { | ||||
| 	.setup		= simone_mmc_spi_setup, | ||||
| 	.cleanup	= simone_mmc_spi_cleanup, | ||||
| 	.cs_control	= simone_mmc_spi_cs_control, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * MMC card detection GPIO setup. | ||||
|  */ | ||||
|  | @ -152,7 +102,6 @@ static struct mmc_spi_platform_data simone_mmc_spi_data = { | |||
| static struct spi_board_info simone_spi_devices[] __initdata = { | ||||
| 	{ | ||||
| 		.modalias		= "mmc_spi", | ||||
| 		.controller_data	= &simone_mmc_spi_ops, | ||||
| 		.platform_data		= &simone_mmc_spi_data, | ||||
| 		/*
 | ||||
| 		 * We use 10 MHz even though the maximum is 3.7 MHz. The driver | ||||
|  | @ -165,8 +114,18 @@ static struct spi_board_info simone_spi_devices[] __initdata = { | |||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * Up to v1.3, the Sim.One used SFRMOUT as SD card chip select, but this goes | ||||
|  * low between multi-message command blocks. From v1.4, it uses a GPIO instead. | ||||
|  * v1.3 parts will still work, since the signal on SFRMOUT is automatic. | ||||
|  */ | ||||
| static int simone_spi_chipselects[] __initdata = { | ||||
| 	EP93XX_GPIO_LINE_EGPIO1, | ||||
| }; | ||||
| 
 | ||||
| static struct ep93xx_spi_info simone_spi_info __initdata = { | ||||
| 	.num_chipselect	= ARRAY_SIZE(simone_spi_devices), | ||||
| 	.chipselect	= simone_spi_chipselects, | ||||
| 	.num_chipselect	= ARRAY_SIZE(simone_spi_chipselects), | ||||
| 	.use_dma = 1, | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -175,33 +175,9 @@ static struct cs4271_platform_data vision_cs4271_data = { | |||
| 	.gpio_nreset	= EP93XX_GPIO_LINE_H(2), | ||||
| }; | ||||
| 
 | ||||
| static int vision_cs4271_hw_setup(struct spi_device *spi) | ||||
| { | ||||
| 	return gpio_request_one(EP93XX_GPIO_LINE_EGPIO6, | ||||
| 				GPIOF_OUT_INIT_HIGH, spi->modalias); | ||||
| } | ||||
| 
 | ||||
| static void vision_cs4271_hw_cleanup(struct spi_device *spi) | ||||
| { | ||||
| 	gpio_free(EP93XX_GPIO_LINE_EGPIO6); | ||||
| } | ||||
| 
 | ||||
| static void vision_cs4271_hw_cs_control(struct spi_device *spi, int value) | ||||
| { | ||||
| 	gpio_set_value(EP93XX_GPIO_LINE_EGPIO6, value); | ||||
| } | ||||
| 
 | ||||
| static struct ep93xx_spi_chip_ops vision_cs4271_hw = { | ||||
| 	.setup		= vision_cs4271_hw_setup, | ||||
| 	.cleanup	= vision_cs4271_hw_cleanup, | ||||
| 	.cs_control	= vision_cs4271_hw_cs_control, | ||||
| }; | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
|  * SPI Flash | ||||
|  *************************************************************************/ | ||||
| #define VISION_SPI_FLASH_CS	EP93XX_GPIO_LINE_EGPIO7 | ||||
| 
 | ||||
| static struct mtd_partition vision_spi_flash_partitions[] = { | ||||
| 	{ | ||||
| 		.name	= "SPI bootstrap", | ||||
|  | @ -224,68 +200,20 @@ static struct flash_platform_data vision_spi_flash_data = { | |||
| 	.nr_parts	= ARRAY_SIZE(vision_spi_flash_partitions), | ||||
| }; | ||||
| 
 | ||||
| static int vision_spi_flash_hw_setup(struct spi_device *spi) | ||||
| { | ||||
| 	return gpio_request_one(VISION_SPI_FLASH_CS, GPIOF_INIT_HIGH, | ||||
| 				spi->modalias); | ||||
| } | ||||
| 
 | ||||
| static void vision_spi_flash_hw_cleanup(struct spi_device *spi) | ||||
| { | ||||
| 	gpio_free(VISION_SPI_FLASH_CS); | ||||
| } | ||||
| 
 | ||||
| static void vision_spi_flash_hw_cs_control(struct spi_device *spi, int value) | ||||
| { | ||||
| 	gpio_set_value(VISION_SPI_FLASH_CS, value); | ||||
| } | ||||
| 
 | ||||
| static struct ep93xx_spi_chip_ops vision_spi_flash_hw = { | ||||
| 	.setup		= vision_spi_flash_hw_setup, | ||||
| 	.cleanup	= vision_spi_flash_hw_cleanup, | ||||
| 	.cs_control	= vision_spi_flash_hw_cs_control, | ||||
| }; | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
|  * SPI SD/MMC host | ||||
|  *************************************************************************/ | ||||
| #define VISION_SPI_MMC_CS	EP93XX_GPIO_LINE_G(2) | ||||
| #define VISION_SPI_MMC_WP	EP93XX_GPIO_LINE_F(0) | ||||
| #define VISION_SPI_MMC_CD	EP93XX_GPIO_LINE_EGPIO15 | ||||
| 
 | ||||
| static struct mmc_spi_platform_data vision_spi_mmc_data = { | ||||
| 	.detect_delay	= 100, | ||||
| 	.powerup_msecs	= 100, | ||||
| 	.ocr_mask	= MMC_VDD_32_33 | MMC_VDD_33_34, | ||||
| 	.flags		= MMC_SPI_USE_CD_GPIO | MMC_SPI_USE_RO_GPIO, | ||||
| 	.cd_gpio	= VISION_SPI_MMC_CD, | ||||
| 	.cd_gpio	= EP93XX_GPIO_LINE_EGPIO15, | ||||
| 	.cd_debounce	= 1, | ||||
| 	.ro_gpio	= VISION_SPI_MMC_WP, | ||||
| 	.ro_gpio	= EP93XX_GPIO_LINE_F(0), | ||||
| 	.caps2		= MMC_CAP2_RO_ACTIVE_HIGH, | ||||
| }; | ||||
| 
 | ||||
| static int vision_spi_mmc_hw_setup(struct spi_device *spi) | ||||
| { | ||||
| 	return gpio_request_one(VISION_SPI_MMC_CS, GPIOF_INIT_HIGH, | ||||
| 				spi->modalias); | ||||
| } | ||||
| 
 | ||||
| static void vision_spi_mmc_hw_cleanup(struct spi_device *spi) | ||||
| { | ||||
| 	gpio_free(VISION_SPI_MMC_CS); | ||||
| } | ||||
| 
 | ||||
| static void vision_spi_mmc_hw_cs_control(struct spi_device *spi, int value) | ||||
| { | ||||
| 	gpio_set_value(VISION_SPI_MMC_CS, value); | ||||
| } | ||||
| 
 | ||||
| static struct ep93xx_spi_chip_ops vision_spi_mmc_hw = { | ||||
| 	.setup		= vision_spi_mmc_hw_setup, | ||||
| 	.cleanup	= vision_spi_mmc_hw_cleanup, | ||||
| 	.cs_control	= vision_spi_mmc_hw_cs_control, | ||||
| }; | ||||
| 
 | ||||
| /*************************************************************************
 | ||||
|  * SPI Bus | ||||
|  *************************************************************************/ | ||||
|  | @ -293,7 +221,6 @@ static struct spi_board_info vision_spi_board_info[] __initdata = { | |||
| 	{ | ||||
| 		.modalias		= "cs4271", | ||||
| 		.platform_data		= &vision_cs4271_data, | ||||
| 		.controller_data	= &vision_cs4271_hw, | ||||
| 		.max_speed_hz		= 6000000, | ||||
| 		.bus_num		= 0, | ||||
| 		.chip_select		= 0, | ||||
|  | @ -301,7 +228,6 @@ static struct spi_board_info vision_spi_board_info[] __initdata = { | |||
| 	}, { | ||||
| 		.modalias		= "sst25l", | ||||
| 		.platform_data		= &vision_spi_flash_data, | ||||
| 		.controller_data	= &vision_spi_flash_hw, | ||||
| 		.max_speed_hz		= 20000000, | ||||
| 		.bus_num		= 0, | ||||
| 		.chip_select		= 1, | ||||
|  | @ -309,7 +235,6 @@ static struct spi_board_info vision_spi_board_info[] __initdata = { | |||
| 	}, { | ||||
| 		.modalias		= "mmc_spi", | ||||
| 		.platform_data		= &vision_spi_mmc_data, | ||||
| 		.controller_data	= &vision_spi_mmc_hw, | ||||
| 		.max_speed_hz		= 20000000, | ||||
| 		.bus_num		= 0, | ||||
| 		.chip_select		= 2, | ||||
|  | @ -317,8 +242,15 @@ static struct spi_board_info vision_spi_board_info[] __initdata = { | |||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int vision_spi_chipselects[] __initdata = { | ||||
| 	EP93XX_GPIO_LINE_EGPIO6, | ||||
| 	EP93XX_GPIO_LINE_EGPIO7, | ||||
| 	EP93XX_GPIO_LINE_G(2), | ||||
| }; | ||||
| 
 | ||||
| static struct ep93xx_spi_info vision_spi_master __initdata = { | ||||
| 	.num_chipselect	= ARRAY_SIZE(vision_spi_board_info), | ||||
| 	.chipselect	= vision_spi_chipselects, | ||||
| 	.num_chipselect	= ARRAY_SIZE(vision_spi_chipselects), | ||||
| 	.use_dma	= 1, | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -57,7 +57,6 @@ struct exynos_wkup_irq { | |||
| struct exynos_pm_data { | ||||
| 	const struct exynos_wkup_irq *wkup_irq; | ||||
| 	unsigned int wake_disable_mask; | ||||
| 	unsigned int *release_ret_regs; | ||||
| 
 | ||||
| 	void (*pm_prepare)(void); | ||||
| 	void (*pm_resume_prepare)(void); | ||||
|  | @ -95,47 +94,6 @@ static const struct exynos_wkup_irq exynos5250_wkup_irq[] = { | |||
| 	{ /* sentinel */ }, | ||||
| }; | ||||
| 
 | ||||
| static unsigned int exynos_release_ret_regs[] = { | ||||
| 	S5P_PAD_RET_MAUDIO_OPTION, | ||||
| 	S5P_PAD_RET_GPIO_OPTION, | ||||
| 	S5P_PAD_RET_UART_OPTION, | ||||
| 	S5P_PAD_RET_MMCA_OPTION, | ||||
| 	S5P_PAD_RET_MMCB_OPTION, | ||||
| 	S5P_PAD_RET_EBIA_OPTION, | ||||
| 	S5P_PAD_RET_EBIB_OPTION, | ||||
| 	REG_TABLE_END, | ||||
| }; | ||||
| 
 | ||||
| static unsigned int exynos3250_release_ret_regs[] = { | ||||
| 	S5P_PAD_RET_MAUDIO_OPTION, | ||||
| 	S5P_PAD_RET_GPIO_OPTION, | ||||
| 	S5P_PAD_RET_UART_OPTION, | ||||
| 	S5P_PAD_RET_MMCA_OPTION, | ||||
| 	S5P_PAD_RET_MMCB_OPTION, | ||||
| 	S5P_PAD_RET_EBIA_OPTION, | ||||
| 	S5P_PAD_RET_EBIB_OPTION, | ||||
| 	S5P_PAD_RET_MMC2_OPTION, | ||||
| 	S5P_PAD_RET_SPI_OPTION, | ||||
| 	REG_TABLE_END, | ||||
| }; | ||||
| 
 | ||||
| static unsigned int exynos5420_release_ret_regs[] = { | ||||
| 	EXYNOS_PAD_RET_DRAM_OPTION, | ||||
| 	EXYNOS_PAD_RET_MAUDIO_OPTION, | ||||
| 	EXYNOS_PAD_RET_JTAG_OPTION, | ||||
| 	EXYNOS5420_PAD_RET_GPIO_OPTION, | ||||
| 	EXYNOS5420_PAD_RET_UART_OPTION, | ||||
| 	EXYNOS5420_PAD_RET_MMCA_OPTION, | ||||
| 	EXYNOS5420_PAD_RET_MMCB_OPTION, | ||||
| 	EXYNOS5420_PAD_RET_MMCC_OPTION, | ||||
| 	EXYNOS5420_PAD_RET_HSI_OPTION, | ||||
| 	EXYNOS_PAD_RET_EBIA_OPTION, | ||||
| 	EXYNOS_PAD_RET_EBIB_OPTION, | ||||
| 	EXYNOS5420_PAD_RET_SPI_OPTION, | ||||
| 	EXYNOS5420_PAD_RET_DRAM_COREBLK_OPTION, | ||||
| 	REG_TABLE_END, | ||||
| }; | ||||
| 
 | ||||
| static int exynos_irq_set_wake(struct irq_data *data, unsigned int state) | ||||
| { | ||||
| 	const struct exynos_wkup_irq *wkup_irq; | ||||
|  | @ -442,15 +400,6 @@ static int exynos5420_pm_suspend(void) | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void exynos_pm_release_retention(void) | ||||
| { | ||||
| 	unsigned int i; | ||||
| 
 | ||||
| 	for (i = 0; (pm_data->release_ret_regs[i] != REG_TABLE_END); i++) | ||||
| 		pmu_raw_writel(EXYNOS_WAKEUP_FROM_LOWPWR, | ||||
| 				pm_data->release_ret_regs[i]); | ||||
| } | ||||
| 
 | ||||
| static void exynos_pm_resume(void) | ||||
| { | ||||
| 	u32 cpuid = read_cpuid_part(); | ||||
|  | @ -458,9 +407,6 @@ static void exynos_pm_resume(void) | |||
| 	if (exynos_pm_central_resume()) | ||||
| 		goto early_wakeup; | ||||
| 
 | ||||
| 	/* For release retention */ | ||||
| 	exynos_pm_release_retention(); | ||||
| 
 | ||||
| 	if (cpuid == ARM_CPU_PART_CORTEX_A9) | ||||
| 		scu_enable(S5P_VA_SCU); | ||||
| 
 | ||||
|  | @ -482,9 +428,6 @@ static void exynos3250_pm_resume(void) | |||
| 	if (exynos_pm_central_resume()) | ||||
| 		goto early_wakeup; | ||||
| 
 | ||||
| 	/* For release retention */ | ||||
| 	exynos_pm_release_retention(); | ||||
| 
 | ||||
| 	pmu_raw_writel(S5P_USE_STANDBY_WFI_ALL, S5P_CENTRAL_SEQ_OPTION); | ||||
| 
 | ||||
| 	if (call_firmware_op(resume) == -ENOSYS | ||||
|  | @ -522,9 +465,6 @@ static void exynos5420_pm_resume(void) | |||
| 	if (exynos_pm_central_resume()) | ||||
| 		goto early_wakeup; | ||||
| 
 | ||||
| 	/* For release retention */ | ||||
| 	exynos_pm_release_retention(); | ||||
| 
 | ||||
| 	pmu_raw_writel(exynos_pmu_spare3, S5P_PMU_SPARE3); | ||||
| 
 | ||||
| early_wakeup: | ||||
|  | @ -637,7 +577,6 @@ static const struct platform_suspend_ops exynos_suspend_ops = { | |||
| static const struct exynos_pm_data exynos3250_pm_data = { | ||||
| 	.wkup_irq	= exynos3250_wkup_irq, | ||||
| 	.wake_disable_mask = ((0xFF << 8) | (0x1F << 1)), | ||||
| 	.release_ret_regs = exynos3250_release_ret_regs, | ||||
| 	.pm_suspend	= exynos_pm_suspend, | ||||
| 	.pm_resume	= exynos3250_pm_resume, | ||||
| 	.pm_prepare	= exynos3250_pm_prepare, | ||||
|  | @ -647,7 +586,6 @@ static const struct exynos_pm_data exynos3250_pm_data = { | |||
| static const struct exynos_pm_data exynos4_pm_data = { | ||||
| 	.wkup_irq	= exynos4_wkup_irq, | ||||
| 	.wake_disable_mask = ((0xFF << 8) | (0x1F << 1)), | ||||
| 	.release_ret_regs = exynos_release_ret_regs, | ||||
| 	.pm_suspend	= exynos_pm_suspend, | ||||
| 	.pm_resume	= exynos_pm_resume, | ||||
| 	.pm_prepare	= exynos_pm_prepare, | ||||
|  | @ -657,7 +595,6 @@ static const struct exynos_pm_data exynos4_pm_data = { | |||
| static const struct exynos_pm_data exynos5250_pm_data = { | ||||
| 	.wkup_irq	= exynos5250_wkup_irq, | ||||
| 	.wake_disable_mask = ((0xFF << 8) | (0x1F << 1)), | ||||
| 	.release_ret_regs = exynos_release_ret_regs, | ||||
| 	.pm_suspend	= exynos_pm_suspend, | ||||
| 	.pm_resume	= exynos_pm_resume, | ||||
| 	.pm_prepare	= exynos_pm_prepare, | ||||
|  | @ -667,7 +604,6 @@ static const struct exynos_pm_data exynos5250_pm_data = { | |||
| static const struct exynos_pm_data exynos5420_pm_data = { | ||||
| 	.wkup_irq	= exynos5250_wkup_irq, | ||||
| 	.wake_disable_mask = (0x7F << 7) | (0x1F << 1), | ||||
| 	.release_ret_regs = exynos5420_release_ret_regs, | ||||
| 	.pm_resume_prepare = exynos5420_prepare_pm_resume, | ||||
| 	.pm_resume	= exynos5420_pm_resume, | ||||
| 	.pm_suspend	= exynos5420_pm_suspend, | ||||
|  |  | |||
|  | @ -484,15 +484,15 @@ static struct pwm_omap_dmtimer_pdata pwm_dmtimer_pdata = { | |||
| }; | ||||
| #endif | ||||
| 
 | ||||
| static struct lirc_rx51_platform_data __maybe_unused rx51_lirc_data = { | ||||
| static struct ir_rx51_platform_data __maybe_unused rx51_ir_data = { | ||||
| 	.set_max_mpu_wakeup_lat = omap_pm_set_max_mpu_wakeup_lat, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device __maybe_unused rx51_lirc_device = { | ||||
| 	.name           = "lirc_rx51", | ||||
| static struct platform_device __maybe_unused rx51_ir_device = { | ||||
| 	.name           = "ir_rx51", | ||||
| 	.id             = -1, | ||||
| 	.dev            = { | ||||
| 		.platform_data = &rx51_lirc_data, | ||||
| 		.platform_data = &rx51_ir_data, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
|  | @ -533,7 +533,7 @@ static struct of_dev_auxdata omap_auxdata_lookup[] __initdata = { | |||
| 		       &omap3_iommu_pdata), | ||||
| 	OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x4809c000, "4809c000.mmc", &mmc_pdata[0]), | ||||
| 	OF_DEV_AUXDATA("ti,omap3-hsmmc", 0x480b4000, "480b4000.mmc", &mmc_pdata[1]), | ||||
| 	OF_DEV_AUXDATA("nokia,n900-ir", 0, "n900-ir", &rx51_lirc_data), | ||||
| 	OF_DEV_AUXDATA("nokia,n900-ir", 0, "n900-ir", &rx51_ir_data), | ||||
| 	/* Only on am3517 */ | ||||
| 	OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL), | ||||
| 	OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0", | ||||
|  |  | |||
|  | @ -130,17 +130,16 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, | |||
| 	freq = clk_get_rate(clk); | ||||
| 	clk_put(clk); | ||||
| 
 | ||||
| 	rcu_read_lock(); | ||||
| 	opp = dev_pm_opp_find_freq_ceil(dev, &freq); | ||||
| 	if (IS_ERR(opp)) { | ||||
| 		rcu_read_unlock(); | ||||
| 		pr_err("%s: unable to find boot up OPP for vdd_%s\n", | ||||
| 			__func__, vdd_name); | ||||
| 		goto exit; | ||||
| 	} | ||||
| 
 | ||||
| 	bootup_volt = dev_pm_opp_get_voltage(opp); | ||||
| 	rcu_read_unlock(); | ||||
| 	dev_pm_opp_put(opp); | ||||
| 
 | ||||
| 	if (!bootup_volt) { | ||||
| 		pr_err("%s: unable to find voltage corresponding to the bootup OPP for vdd_%s\n", | ||||
| 		       __func__, vdd_name); | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ | |||
| #include <linux/init.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/leds.h> | ||||
| #include <linux/sched.h> | ||||
| #include <linux/bitops.h> | ||||
| #include <linux/fb.h> | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ | |||
| #include <linux/gpio.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/leds.h> | ||||
| #include <linux/ioport.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/platform_device.h> | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ | |||
| #include <linux/major.h> | ||||
| #include <linux/fs.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/leds.h> | ||||
| #include <linux/mmc/host.h> | ||||
| #include <linux/mtd/physmap.h> | ||||
| #include <linux/pm.h> | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| #include <linux/kernel.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/leds.h> | ||||
| #include <linux/export.h> | ||||
| #include <linux/sched.h> | ||||
| #include <linux/bitops.h> | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ | |||
| #include <linux/irq.h> | ||||
| #include <linux/gpio_keys.h> | ||||
| #include <linux/input.h> | ||||
| #include <linux/leds.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/usb/gpio_vbus.h> | ||||
| #include <linux/mtd/mtd.h> | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ | |||
| 
 | ||||
| #include <linux/cpufreq.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/leds.h> | ||||
| #include <linux/irq.h> | ||||
| #include <linux/pm.h> | ||||
| #include <linux/gpio.h> | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| #include <linux/module.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/leds.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/gpio.h> | ||||
|  |  | |||
|  | @ -155,13 +155,6 @@ static const struct platform_suspend_ops s5pv210_suspend_ops = { | |||
|  */ | ||||
| static void s5pv210_pm_resume(void) | ||||
| { | ||||
| 	u32 tmp; | ||||
| 
 | ||||
| 	tmp = __raw_readl(S5P_OTHERS); | ||||
| 	tmp |= (S5P_OTHERS_RET_IO | S5P_OTHERS_RET_CF |\ | ||||
| 		S5P_OTHERS_RET_MMC | S5P_OTHERS_RET_UART); | ||||
| 	__raw_writel(tmp , S5P_OTHERS); | ||||
| 
 | ||||
| 	s3c_pm_do_restore_core(s5pv210_core_save, ARRAY_SIZE(s5pv210_core_save)); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -188,10 +188,6 @@ | |||
| #define S5P_SLEEP_CFG_USBOSC_EN		(1 << 1) | ||||
| 
 | ||||
| /* OTHERS Resgister */ | ||||
| #define S5P_OTHERS_RET_IO		(1 << 31) | ||||
| #define S5P_OTHERS_RET_CF		(1 << 30) | ||||
| #define S5P_OTHERS_RET_MMC		(1 << 29) | ||||
| #define S5P_OTHERS_RET_UART		(1 << 28) | ||||
| #define S5P_OTHERS_USB_SIG_MASK		(1 << 16) | ||||
| 
 | ||||
| /* S5P_DAC_CONTROL */ | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| /*
 | ||||
|  *  linux/arch/arm/mm/extable.c | ||||
|  */ | ||||
| #include <linux/module.h> | ||||
| #include <linux/extable.h> | ||||
| #include <linux/uaccess.h> | ||||
| 
 | ||||
| int fixup_exception(struct pt_regs *regs) | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Jiri Kosina
						Jiri Kosina