forked from luck/tmp_suning_uos_patched
Merge commit 'v2.6.39-rc2' into spi/merge
This commit is contained in:
commit
454abcc57f
|
@ -206,8 +206,8 @@ laptops/
|
|||
- directory with laptop related info and laptop driver documentation.
|
||||
ldm.txt
|
||||
- a brief description of LDM (Windows Dynamic Disks).
|
||||
leds-class.txt
|
||||
- documents LED handling under Linux.
|
||||
leds/
|
||||
- directory with info about LED handling under Linux.
|
||||
local_ops.txt
|
||||
- semantics and behavior of local atomic operations.
|
||||
lockdep-design.txt
|
||||
|
|
|
@ -40,7 +40,7 @@ What: /sys/bus/usb/devices/<busnum>-<devnum>:<config num>.<interface num>/<hid-
|
|||
Date: March 2010
|
||||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile holds informations like button
|
||||
press of a button. A profile holds information like button
|
||||
mappings, sensitivity, the colors of the 5 leds and light
|
||||
effects.
|
||||
When read, these files return the respective profile. The
|
||||
|
|
|
@ -33,7 +33,7 @@ Date: August 2010
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When written, this file lets one write the respective profile
|
||||
buttons back to the mouse. The data has to be 77 bytes long.
|
||||
The mouse will reject invalid data.
|
||||
|
@ -47,7 +47,7 @@ Date: August 2010
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When read, these files return the respective profile buttons.
|
||||
The returned data is 77 bytes in size.
|
||||
This file is readonly.
|
||||
|
@ -58,7 +58,7 @@ Date: October 2010
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When written, this file lets one write the respective profile
|
||||
settings back to the mouse. The data has to be 43 bytes long.
|
||||
|
@ -73,7 +73,7 @@ Date: August 2010
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When read, these files return the respective profile settings.
|
||||
The returned data is 43 bytes in size.
|
||||
|
|
|
@ -52,7 +52,7 @@ Date: January 2011
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When written, this file lets one write the respective profile
|
||||
buttons back to the mouse. The data has to be 23 bytes long.
|
||||
The mouse will reject invalid data.
|
||||
|
@ -66,7 +66,7 @@ Date: January 2011
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When read, these files return the respective profile buttons.
|
||||
The returned data is 23 bytes in size.
|
||||
This file is readonly.
|
||||
|
@ -77,7 +77,7 @@ Date: January 2011
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When written, this file lets one write the respective profile
|
||||
settings back to the mouse. The data has to be 16 bytes long.
|
||||
|
@ -92,7 +92,7 @@ Date: January 2011
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When read, these files return the respective profile settings.
|
||||
The returned data is 16 bytes in size.
|
||||
|
|
|
@ -39,7 +39,7 @@ Date: August 2010
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When written, this file lets one write the respective profile
|
||||
settings back to the mouse. The data has to be 13 bytes long.
|
||||
|
@ -54,7 +54,7 @@ Date: August 2010
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_settings holds informations like resolution, sensitivity
|
||||
profile_settings holds information like resolution, sensitivity
|
||||
and light effects.
|
||||
When read, these files return the respective profile settings.
|
||||
The returned data is 13 bytes in size.
|
||||
|
@ -66,7 +66,7 @@ Date: August 2010
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When written, this file lets one write the respective profile
|
||||
buttons back to the mouse. The data has to be 19 bytes long.
|
||||
The mouse will reject invalid data.
|
||||
|
@ -80,7 +80,7 @@ Date: August 2010
|
|||
Contact: Stefan Achatz <erazor_de@users.sourceforge.net>
|
||||
Description: The mouse can store 5 profiles which can be switched by the
|
||||
press of a button. A profile is split in settings and buttons.
|
||||
profile_buttons holds informations about button layout.
|
||||
profile_buttons holds information about button layout.
|
||||
When read, these files return the respective profile buttons.
|
||||
The returned data is 19 bytes in size.
|
||||
This file is readonly.
|
||||
|
|
|
@ -27,7 +27,7 @@ KernelVersion: 2.6.20
|
|||
Contact: "Corentin Chary" <corentincj@iksaif.net>
|
||||
Description:
|
||||
Some models like the W1N have a LED display that can be
|
||||
used to display several informations.
|
||||
used to display several items of information.
|
||||
To control the LED display, use the following :
|
||||
echo 0x0T000DDD > /sys/devices/platform/asus_laptop/
|
||||
where T control the 3 letters display, and DDD the 3 digits display.
|
||||
|
|
|
@ -110,22 +110,22 @@ university server with various users - students, professors, system
|
|||
tasks etc. The resource planning for this server could be along the
|
||||
following lines:
|
||||
|
||||
CPU : Top cpuset
|
||||
CPU : "Top cpuset"
|
||||
/ \
|
||||
CPUSet1 CPUSet2
|
||||
| |
|
||||
(Profs) (Students)
|
||||
| |
|
||||
(Professors) (Students)
|
||||
|
||||
In addition (system tasks) are attached to topcpuset (so
|
||||
that they can run anywhere) with a limit of 20%
|
||||
|
||||
Memory : Professors (50%), students (30%), system (20%)
|
||||
Memory : Professors (50%), Students (30%), system (20%)
|
||||
|
||||
Disk : Prof (50%), students (30%), system (20%)
|
||||
Disk : Professors (50%), Students (30%), system (20%)
|
||||
|
||||
Network : WWW browsing (20%), Network File System (60%), others (20%)
|
||||
/ \
|
||||
Prof (15%) students (5%)
|
||||
Professors (15%) students (5%)
|
||||
|
||||
Browsers like Firefox/Lynx go into the WWW network class, while (k)nfsd go
|
||||
into NFS network class.
|
||||
|
|
|
@ -138,7 +138,7 @@ and properties to be present. This will be described in detail in
|
|||
section III, but, for example, the kernel does not require you to
|
||||
create a node for every PCI device in the system. It is a requirement
|
||||
to have a node for PCI host bridges in order to provide interrupt
|
||||
routing informations and memory/IO ranges, among others. It is also
|
||||
routing information and memory/IO ranges, among others. It is also
|
||||
recommended to define nodes for on chip devices and other buses that
|
||||
don't specifically fit in an existing OF specification. This creates a
|
||||
great flexibility in the way the kernel can then probe those and match
|
||||
|
@ -385,7 +385,7 @@ struct boot_param_header {
|
|||
among others, by kexec. If you are on an SMP system, this value
|
||||
should match the content of the "reg" property of the CPU node in
|
||||
the device-tree corresponding to the CPU calling the kernel entry
|
||||
point (see further chapters for more informations on the required
|
||||
point (see further chapters for more information on the required
|
||||
device-tree contents)
|
||||
|
||||
- size_dt_strings
|
||||
|
@ -553,7 +553,7 @@ looks like in practice.
|
|||
|
||||
This tree is almost a minimal tree. It pretty much contains the
|
||||
minimal set of required nodes and properties to boot a linux kernel;
|
||||
that is, some basic model informations at the root, the CPUs, and the
|
||||
that is, some basic model information at the root, the CPUs, and the
|
||||
physical memory layout. It also includes misc information passed
|
||||
through /chosen, like in this example, the platform type (mandatory)
|
||||
and the kernel command line arguments (optional).
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
The DVB subsystem currently registers to the sysfs subsystem using the
|
||||
"class_simple" interface.
|
||||
|
||||
This means that only the basic informations like module loading parameters
|
||||
This means that only the basic information like module loading parameters
|
||||
are presented through sysfs. Other things that might be interesting are
|
||||
currently *not* available.
|
||||
|
||||
|
|
|
@ -311,7 +311,7 @@ Total Correctable Errors count attribute file:
|
|||
'ce_noinfo_count'
|
||||
|
||||
This attribute file displays the number of CEs that
|
||||
have occurred wherewith no informations as to which DIMM slot
|
||||
have occurred wherewith no information as to which DIMM slot
|
||||
is having errors. Memory is handicapped, but operational,
|
||||
yet no information is available to indicate which slot
|
||||
the failing memory is in. This count field should be also
|
||||
|
|
|
@ -1832,15 +1832,17 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
perfmon on Intel CPUs instead of the
|
||||
CPU specific event set.
|
||||
|
||||
oops=panic Always panic on oopses. Default is to just kill the process,
|
||||
but there is a small probability of deadlocking the machine.
|
||||
oops=panic Always panic on oopses. Default is to just kill the
|
||||
process, but there is a small probability of
|
||||
deadlocking the machine.
|
||||
This will also cause panics on machine check exceptions.
|
||||
Useful together with panic=30 to trigger a reboot.
|
||||
|
||||
OSS [HW,OSS]
|
||||
See Documentation/sound/oss/oss-parameters.txt
|
||||
|
||||
panic= [KNL] Kernel behaviour on panic
|
||||
panic= [KNL] Kernel behaviour on panic: delay <timeout>
|
||||
seconds before rebooting
|
||||
Format: <timeout>
|
||||
|
||||
parkbd.port= [HW] Parallel port number the keyboard adapter is
|
||||
|
@ -2343,6 +2345,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
|
||||
softlockup_panic=
|
||||
[KNL] Should the soft-lockup detector generate panics.
|
||||
Format: <integer>
|
||||
|
||||
sonypi.*= [HW] Sony Programmable I/O Control Device driver
|
||||
See Documentation/sonypi.txt
|
||||
|
@ -2475,8 +2478,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
topology= [S390]
|
||||
Format: {off | on}
|
||||
Specify if the kernel should make use of the cpu
|
||||
topology informations if the hardware supports these.
|
||||
The scheduler will make use of these informations and
|
||||
topology information if the hardware supports this.
|
||||
The scheduler will make use of this information and
|
||||
e.g. base its process migration decisions on it.
|
||||
Default is on.
|
||||
|
||||
|
@ -2529,8 +2532,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
reported either.
|
||||
|
||||
unknown_nmi_panic
|
||||
[X86]
|
||||
Set unknown_nmi_panic=1 early on boot.
|
||||
[X86] Cause panic on unknown NMI.
|
||||
|
||||
usbcore.autosuspend=
|
||||
[USB] The autosuspend time delay (in seconds) used
|
||||
|
|
|
@ -11,6 +11,7 @@ with the difference that the orphan objects are not freed but only
|
|||
reported via /sys/kernel/debug/kmemleak. A similar method is used by the
|
||||
Valgrind tool (memcheck --leak-check) to detect the memory leaks in
|
||||
user-space applications.
|
||||
Kmemleak is supported on x86, arm, powerpc, sparc, sh, microblaze and tile.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
@ -178,5 +179,4 @@ block doesn't need to be freed (some cases in the init_call functions),
|
|||
the pointer is calculated by other methods than the usual container_of
|
||||
macro or the pointer is stored in a location not scanned by kmemleak.
|
||||
|
||||
Page allocations and ioremap are not tracked. Only the ARM and x86
|
||||
architectures are currently supported.
|
||||
Page allocations and ioremap are not tracked.
|
||||
|
|
|
@ -61,7 +61,7 @@ Usage
|
|||
Hotkeys are also reported as input keys (like keyboards) you can check
|
||||
which key are supported using "xev" under X11.
|
||||
|
||||
You can get informations on the version of your DSDT table by reading the
|
||||
You can get information on the version of your DSDT table by reading the
|
||||
/sys/devices/platform/asus-laptop/infos entry. If you have a question or a
|
||||
bug report to do, please include the output of this entry.
|
||||
|
||||
|
@ -178,7 +178,7 @@ LED display
|
|||
-----------
|
||||
|
||||
Some models like the W1N have a LED display that can be used to display
|
||||
several informations.
|
||||
several items of information.
|
||||
|
||||
LED display works for the following models:
|
||||
W1000N
|
||||
|
|
8
Documentation/leds/00-INDEX
Normal file
8
Documentation/leds/00-INDEX
Normal file
|
@ -0,0 +1,8 @@
|
|||
leds-class.txt
|
||||
- documents LED handling under Linux.
|
||||
leds-lp3944.txt
|
||||
- notes on how to use the leds-lp3944 driver.
|
||||
leds-lp5521.txt
|
||||
- notes on how to use the leds-lp5521 driver.
|
||||
leds-lp5523.txt
|
||||
- notes on how to use the leds-lp5523 driver.
|
|
@ -95,4 +95,3 @@ There are a number of cases where a trigger might only be mappable to a
|
|||
particular LED (ACPI?). The addition of triggers provided by the LED driver
|
||||
should cover this option and be possible to add without breaking the
|
||||
current interface.
|
||||
|
|
@ -72,7 +72,7 @@ folder:
|
|||
# fragmentation gw_sel_class vis_mode
|
||||
|
||||
|
||||
There is a special folder for debugging informations:
|
||||
There is a special folder for debugging information:
|
||||
|
||||
# ls /sys/kernel/debug/batman_adv/bat0/
|
||||
# gateways socket transtable_global vis_data
|
||||
|
|
|
@ -2273,7 +2273,7 @@ IP forwarding is on.
|
|||
There is a lot of useful info in here best found by going in & having a look around,
|
||||
so I'll take you through some entries I consider important.
|
||||
|
||||
All the processes running on the machine have there own entry defined by
|
||||
All the processes running on the machine have their own entry defined by
|
||||
/proc/<pid>
|
||||
So lets have a look at the init process
|
||||
cd /proc/1
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
Each CPU has a "base" scheduling domain (struct sched_domain). These are
|
||||
accessed via cpu_sched_domain(i) and this_sched_domain() macros. The domain
|
||||
Each CPU has a "base" scheduling domain (struct sched_domain). The domain
|
||||
hierarchy is built from these base domains via the ->parent pointer. ->parent
|
||||
MUST be NULL terminated, and domain structures should be per-CPU as they
|
||||
are locklessly updated.
|
||||
MUST be NULL terminated, and domain structures should be per-CPU as they are
|
||||
locklessly updated.
|
||||
|
||||
Each scheduling domain spans a number of CPUs (stored in the ->span field).
|
||||
A domain's span MUST be a superset of it child's span (this restriction could
|
||||
|
@ -26,11 +25,26 @@ is treated as one entity. The load of a group is defined as the sum of the
|
|||
load of each of its member CPUs, and only when the load of a group becomes
|
||||
out of balance are tasks moved between groups.
|
||||
|
||||
In kernel/sched.c, rebalance_tick is run periodically on each CPU. This
|
||||
function takes its CPU's base sched domain and checks to see if has reached
|
||||
its rebalance interval. If so, then it will run load_balance on that domain.
|
||||
rebalance_tick then checks the parent sched_domain (if it exists), and the
|
||||
parent of the parent and so forth.
|
||||
In kernel/sched.c, trigger_load_balance() is run periodically on each CPU
|
||||
through scheduler_tick(). It raises a softirq after the next regularly scheduled
|
||||
rebalancing event for the current runqueue has arrived. The actual load
|
||||
balancing workhorse, run_rebalance_domains()->rebalance_domains(), is then run
|
||||
in softirq context (SCHED_SOFTIRQ).
|
||||
|
||||
The latter function takes two arguments: the current CPU and whether it was idle
|
||||
at the time the scheduler_tick() happened and iterates over all sched domains
|
||||
our CPU is on, starting from its base domain and going up the ->parent chain.
|
||||
While doing that, it checks to see if the current domain has exhausted its
|
||||
rebalance interval. If so, it runs load_balance() on that domain. It then checks
|
||||
the parent sched_domain (if it exists), and the parent of the parent and so
|
||||
forth.
|
||||
|
||||
Initially, load_balance() finds the busiest group in the current sched domain.
|
||||
If it succeeds, it looks for the busiest runqueue of all the CPUs' runqueues in
|
||||
that group. If it manages to find such a runqueue, it locks both our initial
|
||||
CPU's runqueue and the newly found busiest one and starts moving tasks from it
|
||||
to our runqueue. The exact number of tasks amounts to an imbalance previously
|
||||
computed while iterating over this sched domain's groups.
|
||||
|
||||
*** Implementing sched domains ***
|
||||
The "base" domain will "span" the first level of the hierarchy. In the case
|
||||
|
|
|
@ -285,7 +285,7 @@ from the driver.
|
|||
|
||||
7. Profiling information
|
||||
|
||||
This driver does not provide profiling informations as did its predecessors.
|
||||
This driver does not provide profiling information as did its predecessors.
|
||||
This feature was not this useful and added complexity to the code.
|
||||
As the driver code got more complex, I have decided to remove everything
|
||||
that didn't seem actually useful.
|
||||
|
|
|
@ -2229,7 +2229,7 @@ Proc interfaces (/proc/asound)
|
|||
|
||||
/proc/asound/card#/pcm#[cp]/oss
|
||||
-------------------------------
|
||||
String "erase" - erase all additional informations about OSS applications
|
||||
String "erase" - erase all additional information about OSS applications
|
||||
String "<app_name> <fragments> <fragment_size> [<options>]"
|
||||
|
||||
<app_name> - name of application with (higher priority) or without path
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
Driver
|
||||
------
|
||||
|
||||
Informations about Audio Excel DSP 16 driver can be found in the source
|
||||
Information about Audio Excel DSP 16 driver can be found in the source
|
||||
file aedsp16.c
|
||||
Please, read the head of the source before using it. It contain useful
|
||||
informations.
|
||||
information.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
@ -68,7 +68,7 @@ Sound cards supported
|
|||
This driver supports the SC-6000 and SC-6600 based Gallant's sound card.
|
||||
It don't support the Audio Excel DSP 16 III (try the SC-6600 code).
|
||||
I'm working on the III version of the card: if someone have useful
|
||||
informations about it, please let me know.
|
||||
information about it, please let me know.
|
||||
For all the non-supported audio cards, you have to boot MS-DOS (or WIN95)
|
||||
activating the audio card with the MS-DOS device driver, then you have to
|
||||
<ctrl>-<alt>-<del> and boot Linux.
|
||||
|
|
|
@ -5,7 +5,7 @@ FIRST OF ALL
|
|||
============
|
||||
|
||||
This code references YAMAHA's sample codes and data sheets.
|
||||
I respect and thank for all people they made open the informations
|
||||
I respect and thank for all people they made open the information
|
||||
about YMF7xx cards.
|
||||
|
||||
And this codes heavily based on Jeff Garzik <jgarzik@pobox.com>'s
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
Note: "modinfo <module>" prints various informations about a kernel
|
||||
Note: "modinfo <module>" prints various information about a kernel
|
||||
module, among them a complete and up-to-date list of insmod options.
|
||||
This list tends to be outdated because it is updated manually ...
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ completely by the bt8xx chip, which is common on all boards. But
|
|||
sound is handled in slightly different ways on each board.
|
||||
|
||||
To handle the grabber boards correctly, there is a array tvcards[] in
|
||||
bttv-cards.c, which holds the informations required for each board.
|
||||
bttv-cards.c, which holds the information required for each board.
|
||||
Sound will work only, if the correct entry is used (for video it often
|
||||
makes no difference). The bttv driver prints a line to the kernel
|
||||
log, telling which card type is used. Like this one:
|
||||
|
|
|
@ -191,10 +191,10 @@ Syntax: <n>
|
|||
Description: Debugging information level, from 0 to 3:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant informations
|
||||
2 = significant information
|
||||
3 = more verbose messages
|
||||
Level 3 is useful for testing only, when only one device
|
||||
is used at the same time. It also shows some more informations
|
||||
is used at the same time. It also shows some more information
|
||||
about the hardware being detected. This module parameter can be
|
||||
changed at runtime thanks to the /sys filesystem interface.
|
||||
Default: 2
|
||||
|
|
|
@ -214,10 +214,10 @@ Syntax: <n>
|
|||
Description: Debugging information level, from 0 to 3:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant informations
|
||||
2 = significant information
|
||||
3 = more verbose messages
|
||||
Level 3 is useful for testing only. It also shows some more
|
||||
informations about the hardware being detected.
|
||||
information about the hardware being detected.
|
||||
This parameter can be changed at runtime thanks to the /sys
|
||||
filesystem interface.
|
||||
Default: 2
|
||||
|
|
|
@ -413,7 +413,7 @@ Syntax: <n>
|
|||
Description: Debugging information level, from 0 to 6:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant informations
|
||||
2 = significant information
|
||||
3 = configuration or general messages
|
||||
4 = warnings
|
||||
5 = called functions
|
||||
|
|
|
@ -181,10 +181,10 @@ Syntax: <n>
|
|||
Description: Debugging information level, from 0 to 3:
|
||||
0 = none (use carefully)
|
||||
1 = critical errors
|
||||
2 = significant informations
|
||||
2 = significant information
|
||||
3 = more verbose messages
|
||||
Level 3 is useful for testing only, when only one device
|
||||
is used at the same time. It also shows some more informations
|
||||
is used at the same time. It also shows some information
|
||||
about the hardware being detected. This module parameter can be
|
||||
changed at runtime thanks to the /sys filesystem interface.
|
||||
Default: 2
|
||||
|
@ -261,7 +261,7 @@ the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.
|
|||
|
||||
11. Credits
|
||||
===========
|
||||
- Informations about the chip internals needed to enable the I2C protocol have
|
||||
- Information about the chip internals needed to enable the I2C protocol have
|
||||
been taken from the documentation of the ZC030x Video4Linux1 driver written
|
||||
by Andrew Birkett <andy@nobugs.org>;
|
||||
- The initialization values of the ZC0301 controller connected to the PAS202BCB
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 39
|
||||
EXTRAVERSION = -rc1
|
||||
EXTRAVERSION = -rc2
|
||||
NAME = Flesh-Eating Bats with Fangs
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -12,7 +12,6 @@ config ALPHA
|
|||
select GENERIC_IRQ_PROBE
|
||||
select AUTO_IRQ_AFFINITY if SMP
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_HARDIRQS_NO_DEPRECATED
|
||||
help
|
||||
The Alpha is a 64-bit general-purpose processor designed and
|
||||
marketed by the Digital Equipment Corporation of blessed memory,
|
||||
|
|
|
@ -366,6 +366,7 @@ config ARCH_MXC
|
|||
select GENERIC_CLOCKEVENTS
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select CLKDEV_LOOKUP
|
||||
select HAVE_SCHED_CLOCK
|
||||
help
|
||||
Support for Freescale MXC/iMX-based family of processors
|
||||
|
||||
|
|
|
@ -21,20 +21,12 @@
|
|||
|
||||
#if defined(CONFIG_DEBUG_ICEDCC)
|
||||
|
||||
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K)
|
||||
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)
|
||||
.macro loadsp, rb, tmp
|
||||
.endm
|
||||
.macro writeb, ch, rb
|
||||
mcr p14, 0, \ch, c0, c5, 0
|
||||
.endm
|
||||
#elif defined(CONFIG_CPU_V7)
|
||||
.macro loadsp, rb, tmp
|
||||
.endm
|
||||
.macro writeb, ch, rb
|
||||
wait: mrc p14, 0, pc, c0, c1, 0
|
||||
bcs wait
|
||||
mcr p14, 0, \ch, c0, c5, 0
|
||||
.endm
|
||||
#elif defined(CONFIG_CPU_XSCALE)
|
||||
.macro loadsp, rb, tmp
|
||||
.endm
|
||||
|
|
|
@ -36,7 +36,7 @@ extern void error(char *x);
|
|||
|
||||
#ifdef CONFIG_DEBUG_ICEDCC
|
||||
|
||||
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K)
|
||||
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)
|
||||
|
||||
static void icedcc_putc(int ch)
|
||||
{
|
||||
|
@ -52,16 +52,6 @@ static void icedcc_putc(int ch)
|
|||
asm("mcr p14, 0, %0, c0, c5, 0" : : "r" (ch));
|
||||
}
|
||||
|
||||
#elif defined(CONFIG_CPU_V7)
|
||||
|
||||
static void icedcc_putc(int ch)
|
||||
{
|
||||
asm(
|
||||
"wait: mrc p14, 0, pc, c0, c1, 0 \n\
|
||||
bcs wait \n\
|
||||
mcr p14, 0, %0, c0, c5, 0 "
|
||||
: : "r" (ch));
|
||||
}
|
||||
|
||||
#elif defined(CONFIG_CPU_XSCALE)
|
||||
|
||||
|
|
|
@ -20,8 +20,6 @@ struct pxa2xx_udc_mach_info {
|
|||
* VBUS IRQ and omit the methods above. Store the GPIO number
|
||||
* here. Note that sometimes the signals go through inverters...
|
||||
*/
|
||||
bool gpio_vbus_inverted;
|
||||
int gpio_vbus; /* high == vbus present */
|
||||
bool gpio_pullup_inverted;
|
||||
int gpio_pullup; /* high == pullup activated */
|
||||
};
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
.macro addruart, rp, rv
|
||||
.endm
|
||||
|
||||
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K)
|
||||
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)
|
||||
|
||||
.macro senduart, rd, rx
|
||||
mcr p14, 0, \rd, c0, c5, 0
|
||||
|
@ -49,23 +49,6 @@
|
|||
1002:
|
||||
.endm
|
||||
|
||||
#elif defined(CONFIG_CPU_V7)
|
||||
|
||||
.macro senduart, rd, rx
|
||||
mcr p14, 0, \rd, c0, c5, 0
|
||||
.endm
|
||||
|
||||
.macro busyuart, rd, rx
|
||||
busy: mrc p14, 0, pc, c0, c1, 0
|
||||
bcs busy
|
||||
.endm
|
||||
|
||||
.macro waituart, rd, rx
|
||||
wait: mrc p14, 0, pc, c0, c1, 0
|
||||
bcs wait
|
||||
|
||||
.endm
|
||||
|
||||
#elif defined(CONFIG_CPU_XSCALE)
|
||||
|
||||
.macro senduart, rd, rx
|
||||
|
|
|
@ -338,7 +338,7 @@ static struct miscdevice etb_miscdev = {
|
|||
.fops = &etb_fops,
|
||||
};
|
||||
|
||||
static int __init etb_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
static int __devinit etb_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
{
|
||||
struct tracectx *t = &tracer;
|
||||
int ret = 0;
|
||||
|
@ -530,7 +530,7 @@ static ssize_t trace_mode_store(struct kobject *kobj,
|
|||
static struct kobj_attribute trace_mode_attr =
|
||||
__ATTR(trace_mode, 0644, trace_mode_show, trace_mode_store);
|
||||
|
||||
static int __init etm_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
static int __devinit etm_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
{
|
||||
struct tracectx *t = &tracer;
|
||||
int ret = 0;
|
||||
|
|
|
@ -594,7 +594,8 @@ static void __kprobes emulate_ldr(struct kprobe *p, struct pt_regs *regs)
|
|||
long cpsr = regs->ARM_cpsr;
|
||||
|
||||
fnr.dr = insnslot_llret_3arg_rflags(rnv, 0, rmv, cpsr, i_fn);
|
||||
regs->uregs[rn] = fnr.r0; /* Save Rn in case of writeback. */
|
||||
if (rn != 15)
|
||||
regs->uregs[rn] = fnr.r0; /* Save Rn in case of writeback. */
|
||||
rdv = fnr.r1;
|
||||
|
||||
if (rd == 15) {
|
||||
|
@ -622,10 +623,11 @@ static void __kprobes emulate_str(struct kprobe *p, struct pt_regs *regs)
|
|||
long rdv = (rd == 15) ? iaddr + str_pc_offset : regs->uregs[rd];
|
||||
long rnv = (rn == 15) ? iaddr + 8 : regs->uregs[rn];
|
||||
long rmv = regs->uregs[rm]; /* rm/rmv may be invalid, don't care. */
|
||||
long rnv_wb;
|
||||
|
||||
/* Save Rn in case of writeback. */
|
||||
regs->uregs[rn] =
|
||||
insnslot_3arg_rflags(rnv, rdv, rmv, regs->ARM_cpsr, i_fn);
|
||||
rnv_wb = insnslot_3arg_rflags(rnv, rdv, rmv, regs->ARM_cpsr, i_fn);
|
||||
if (rn != 15)
|
||||
regs->uregs[rn] = rnv_wb; /* Save Rn in case of writeback. */
|
||||
}
|
||||
|
||||
static void __kprobes emulate_mrrc(struct kprobe *p, struct pt_regs *regs)
|
||||
|
|
|
@ -79,6 +79,7 @@ struct arm_pmu {
|
|||
void (*write_counter)(int idx, u32 val);
|
||||
void (*start)(void);
|
||||
void (*stop)(void);
|
||||
void (*reset)(void *);
|
||||
const unsigned (*cache_map)[PERF_COUNT_HW_CACHE_MAX]
|
||||
[PERF_COUNT_HW_CACHE_OP_MAX]
|
||||
[PERF_COUNT_HW_CACHE_RESULT_MAX];
|
||||
|
@ -204,11 +205,9 @@ armpmu_event_set_period(struct perf_event *event,
|
|||
static u64
|
||||
armpmu_event_update(struct perf_event *event,
|
||||
struct hw_perf_event *hwc,
|
||||
int idx)
|
||||
int idx, int overflow)
|
||||
{
|
||||
int shift = 64 - 32;
|
||||
s64 prev_raw_count, new_raw_count;
|
||||
u64 delta;
|
||||
u64 delta, prev_raw_count, new_raw_count;
|
||||
|
||||
again:
|
||||
prev_raw_count = local64_read(&hwc->prev_count);
|
||||
|
@ -218,8 +217,13 @@ armpmu_event_update(struct perf_event *event,
|
|||
new_raw_count) != prev_raw_count)
|
||||
goto again;
|
||||
|
||||
delta = (new_raw_count << shift) - (prev_raw_count << shift);
|
||||
delta >>= shift;
|
||||
new_raw_count &= armpmu->max_period;
|
||||
prev_raw_count &= armpmu->max_period;
|
||||
|
||||
if (overflow)
|
||||
delta = armpmu->max_period - prev_raw_count + new_raw_count;
|
||||
else
|
||||
delta = new_raw_count - prev_raw_count;
|
||||
|
||||
local64_add(delta, &event->count);
|
||||
local64_sub(delta, &hwc->period_left);
|
||||
|
@ -236,7 +240,7 @@ armpmu_read(struct perf_event *event)
|
|||
if (hwc->idx < 0)
|
||||
return;
|
||||
|
||||
armpmu_event_update(event, hwc, hwc->idx);
|
||||
armpmu_event_update(event, hwc, hwc->idx, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -254,7 +258,7 @@ armpmu_stop(struct perf_event *event, int flags)
|
|||
if (!(hwc->state & PERF_HES_STOPPED)) {
|
||||
armpmu->disable(hwc, hwc->idx);
|
||||
barrier(); /* why? */
|
||||
armpmu_event_update(event, hwc, hwc->idx);
|
||||
armpmu_event_update(event, hwc, hwc->idx, 0);
|
||||
hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
|
||||
}
|
||||
}
|
||||
|
@ -624,6 +628,19 @@ static struct pmu pmu = {
|
|||
#include "perf_event_v6.c"
|
||||
#include "perf_event_v7.c"
|
||||
|
||||
/*
|
||||
* Ensure the PMU has sane values out of reset.
|
||||
* This requires SMP to be available, so exists as a separate initcall.
|
||||
*/
|
||||
static int __init
|
||||
armpmu_reset(void)
|
||||
{
|
||||
if (armpmu && armpmu->reset)
|
||||
return on_each_cpu(armpmu->reset, NULL, 1);
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(armpmu_reset);
|
||||
|
||||
static int __init
|
||||
init_hw_perf_events(void)
|
||||
{
|
||||
|
|
|
@ -474,7 +474,7 @@ armv6pmu_handle_irq(int irq_num,
|
|||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
|
|
@ -466,6 +466,7 @@ static inline unsigned long armv7_pmnc_read(void)
|
|||
static inline void armv7_pmnc_write(unsigned long val)
|
||||
{
|
||||
val &= ARMV7_PMNC_MASK;
|
||||
isb();
|
||||
asm volatile("mcr p15, 0, %0, c9, c12, 0" : : "r"(val));
|
||||
}
|
||||
|
||||
|
@ -502,6 +503,7 @@ static inline int armv7_pmnc_select_counter(unsigned int idx)
|
|||
|
||||
val = (idx - ARMV7_EVENT_CNT_TO_CNTx) & ARMV7_SELECT_MASK;
|
||||
asm volatile("mcr p15, 0, %0, c9, c12, 5" : : "r" (val));
|
||||
isb();
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
@ -780,7 +782,7 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)
|
|||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
@ -847,6 +849,18 @@ static int armv7pmu_get_event_idx(struct cpu_hw_events *cpuc,
|
|||
}
|
||||
}
|
||||
|
||||
static void armv7pmu_reset(void *info)
|
||||
{
|
||||
u32 idx, nb_cnt = armpmu->num_events;
|
||||
|
||||
/* The counter and interrupt enable registers are unknown at reset. */
|
||||
for (idx = 1; idx < nb_cnt; ++idx)
|
||||
armv7pmu_disable_event(NULL, idx);
|
||||
|
||||
/* Initialize & Reset PMNC: C and P bits */
|
||||
armv7_pmnc_write(ARMV7_PMNC_P | ARMV7_PMNC_C);
|
||||
}
|
||||
|
||||
static struct arm_pmu armv7pmu = {
|
||||
.handle_irq = armv7pmu_handle_irq,
|
||||
.enable = armv7pmu_enable_event,
|
||||
|
@ -856,17 +870,15 @@ static struct arm_pmu armv7pmu = {
|
|||
.get_event_idx = armv7pmu_get_event_idx,
|
||||
.start = armv7pmu_start,
|
||||
.stop = armv7pmu_stop,
|
||||
.reset = armv7pmu_reset,
|
||||
.raw_event_mask = 0xFF,
|
||||
.max_period = (1LLU << 32) - 1,
|
||||
};
|
||||
|
||||
static u32 __init armv7_reset_read_pmnc(void)
|
||||
static u32 __init armv7_read_num_pmnc_events(void)
|
||||
{
|
||||
u32 nb_cnt;
|
||||
|
||||
/* Initialize & Reset PMNC: C and P bits */
|
||||
armv7_pmnc_write(ARMV7_PMNC_P | ARMV7_PMNC_C);
|
||||
|
||||
/* Read the nb of CNTx counters supported from PMNC */
|
||||
nb_cnt = (armv7_pmnc_read() >> ARMV7_PMNC_N_SHIFT) & ARMV7_PMNC_N_MASK;
|
||||
|
||||
|
@ -880,7 +892,7 @@ static const struct arm_pmu *__init armv7_a8_pmu_init(void)
|
|||
armv7pmu.name = "ARMv7 Cortex-A8";
|
||||
armv7pmu.cache_map = &armv7_a8_perf_cache_map;
|
||||
armv7pmu.event_map = &armv7_a8_perf_map;
|
||||
armv7pmu.num_events = armv7_reset_read_pmnc();
|
||||
armv7pmu.num_events = armv7_read_num_pmnc_events();
|
||||
return &armv7pmu;
|
||||
}
|
||||
|
||||
|
@ -890,7 +902,7 @@ static const struct arm_pmu *__init armv7_a9_pmu_init(void)
|
|||
armv7pmu.name = "ARMv7 Cortex-A9";
|
||||
armv7pmu.cache_map = &armv7_a9_perf_cache_map;
|
||||
armv7pmu.event_map = &armv7_a9_perf_map;
|
||||
armv7pmu.num_events = armv7_reset_read_pmnc();
|
||||
armv7pmu.num_events = armv7_read_num_pmnc_events();
|
||||
return &armv7pmu;
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -246,7 +246,7 @@ xscale1pmu_handle_irq(int irq_num, void *dev)
|
|||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
@ -578,7 +578,7 @@ xscale2pmu_handle_irq(int irq_num, void *dev)
|
|||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
|
|
@ -119,11 +119,19 @@ ENTRY(cpu_resume)
|
|||
#else
|
||||
ldr r0, sleep_save_sp @ stack phys addr
|
||||
#endif
|
||||
msr cpsr_c, #PSR_I_BIT | PSR_F_BIT | SVC_MODE @ set SVC, irqs off
|
||||
setmode PSR_I_BIT | PSR_F_BIT | SVC_MODE, r1 @ set SVC, irqs off
|
||||
#ifdef MULTI_CPU
|
||||
ldmia r0!, {r1, sp, lr, pc} @ load v:p, stack, return fn, resume fn
|
||||
@ load v:p, stack, return fn, resume fn
|
||||
ARM( ldmia r0!, {r1, sp, lr, pc} )
|
||||
THUMB( ldmia r0!, {r1, r2, r3, r4} )
|
||||
THUMB( mov sp, r2 )
|
||||
THUMB( mov lr, r3 )
|
||||
THUMB( bx r4 )
|
||||
#else
|
||||
ldmia r0!, {r1, sp, lr} @ load v:p, stack, return fn
|
||||
@ load v:p, stack, return fn
|
||||
ARM( ldmia r0!, {r1, sp, lr} )
|
||||
THUMB( ldmia r0!, {r1, r2, lr} )
|
||||
THUMB( mov sp, r2 )
|
||||
b cpu_do_resume
|
||||
#endif
|
||||
ENDPROC(cpu_resume)
|
||||
|
|
|
@ -255,6 +255,7 @@ config MACH_IMX27_VISSTRIM_M10
|
|||
bool "Vista Silicon i.MX27 Visstrim_m10"
|
||||
select SOC_IMX27
|
||||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_IMX_SSI
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_MXC_MMC
|
||||
select IMX_HAVE_PLATFORM_MXC_EHCI
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <mach/mx25.h>
|
||||
#include <mach/imx-uart.h>
|
||||
#include <mach/audmux.h>
|
||||
#include <mach/esdhc.h>
|
||||
|
||||
#include "devices-imx25.h"
|
||||
|
||||
|
@ -242,6 +243,11 @@ struct imx_ssi_platform_data eukrea_mbimxsd_ssi_pdata __initconst = {
|
|||
.flags = IMX_SSI_SYN | IMX_SSI_NET | IMX_SSI_USE_I2S_SLAVE,
|
||||
};
|
||||
|
||||
static struct esdhc_platform_data sd1_pdata = {
|
||||
.cd_gpio = GPIO_SD1CD,
|
||||
.wp_gpio = -EINVAL,
|
||||
};
|
||||
|
||||
/*
|
||||
* system init for baseboard usage. Will be called by cpuimx25 init.
|
||||
*
|
||||
|
@ -275,7 +281,7 @@ void __init eukrea_mbimxsd25_baseboard_init(void)
|
|||
imx25_add_imx_ssi(0, &eukrea_mbimxsd_ssi_pdata);
|
||||
|
||||
imx25_add_flexcan1(NULL);
|
||||
imx25_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx25_add_sdhci_esdhc_imx(0, &sd1_pdata);
|
||||
|
||||
gpio_request(GPIO_LED1, "LED1");
|
||||
gpio_direction_output(GPIO_LED1, 1);
|
||||
|
|
|
@ -57,6 +57,12 @@ static struct mvsdio_platform_data sheeva_esata_mvsdio_data = {
|
|||
};
|
||||
|
||||
static struct gpio_led sheevaplug_led_pins[] = {
|
||||
{
|
||||
.name = "plug:red:misc",
|
||||
.default_trigger = "none",
|
||||
.gpio = 46,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "plug:green:health",
|
||||
.default_trigger = "default-on",
|
||||
|
@ -80,6 +86,7 @@ static struct platform_device sheevaplug_leds = {
|
|||
|
||||
static unsigned int sheevaplug_mpp_config[] __initdata = {
|
||||
MPP29_GPIO, /* USB Power Enable */
|
||||
MPP46_GPIO, /* LED Red */
|
||||
MPP49_GPIO, /* LED */
|
||||
0
|
||||
};
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include <mach/ipu.h>
|
||||
#include <mach/mx3fb.h>
|
||||
#include <mach/audmux.h>
|
||||
#include <mach/esdhc.h>
|
||||
|
||||
#include "devices-imx35.h"
|
||||
#include "devices.h"
|
||||
|
@ -163,11 +164,14 @@ static iomux_v3_cfg_t eukrea_mbimxsd_pads[] = {
|
|||
MX35_PAD_SD1_DATA1__ESDHC1_DAT1,
|
||||
MX35_PAD_SD1_DATA2__ESDHC1_DAT2,
|
||||
MX35_PAD_SD1_DATA3__ESDHC1_DAT3,
|
||||
/* SD1 CD */
|
||||
MX35_PAD_LD18__GPIO3_24,
|
||||
};
|
||||
|
||||
#define GPIO_LED1 IMX_GPIO_NR(3, 29)
|
||||
#define GPIO_SWITCH1 IMX_GPIO_NR(3, 25)
|
||||
#define GPIO_LCDPWR (4)
|
||||
#define GPIO_LCDPWR IMX_GPIO_NR(1, 4)
|
||||
#define GPIO_SD1CD IMX_GPIO_NR(3, 24)
|
||||
|
||||
static void eukrea_mbimxsd_lcd_power_set(struct plat_lcd_data *pd,
|
||||
unsigned int power)
|
||||
|
@ -254,6 +258,11 @@ struct imx_ssi_platform_data eukrea_mbimxsd_ssi_pdata __initconst = {
|
|||
.flags = IMX_SSI_SYN | IMX_SSI_NET | IMX_SSI_USE_I2S_SLAVE,
|
||||
};
|
||||
|
||||
static struct esdhc_platform_data sd1_pdata = {
|
||||
.cd_gpio = GPIO_SD1CD,
|
||||
.wp_gpio = -EINVAL,
|
||||
};
|
||||
|
||||
/*
|
||||
* system init for baseboard usage. Will be called by cpuimx35 init.
|
||||
*
|
||||
|
@ -289,7 +298,7 @@ void __init eukrea_mbimxsd35_baseboard_init(void)
|
|||
imx35_add_imx_ssi(0, &eukrea_mbimxsd_ssi_pdata);
|
||||
|
||||
imx35_add_flexcan1(NULL);
|
||||
imx35_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx35_add_sdhci_esdhc_imx(0, &sd1_pdata);
|
||||
|
||||
gpio_request(GPIO_LED1, "LED1");
|
||||
gpio_direction_output(GPIO_LED1, 1);
|
||||
|
@ -301,7 +310,6 @@ void __init eukrea_mbimxsd35_baseboard_init(void)
|
|||
|
||||
gpio_request(GPIO_LCDPWR, "LCDPWR");
|
||||
gpio_direction_output(GPIO_LCDPWR, 1);
|
||||
gpio_free(GPIO_LCDPWR);
|
||||
|
||||
i2c_register_board_info(0, eukrea_mbimxsd_i2c_devices,
|
||||
ARRAY_SIZE(eukrea_mbimxsd_i2c_devices));
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include <mach/mx3fb.h>
|
||||
#include <mach/ulpi.h>
|
||||
#include <mach/audmux.h>
|
||||
#include <mach/esdhc.h>
|
||||
|
||||
#include "devices-imx35.h"
|
||||
#include "devices.h"
|
||||
|
@ -217,11 +218,15 @@ static iomux_v3_cfg_t pcm043_pads[] = {
|
|||
MX35_PAD_SD1_DATA1__ESDHC1_DAT1,
|
||||
MX35_PAD_SD1_DATA2__ESDHC1_DAT2,
|
||||
MX35_PAD_SD1_DATA3__ESDHC1_DAT3,
|
||||
MX35_PAD_ATA_DATA10__GPIO2_23, /* WriteProtect */
|
||||
MX35_PAD_ATA_DATA11__GPIO2_24, /* CardDetect */
|
||||
};
|
||||
|
||||
#define AC97_GPIO_TXFS IMX_GPIO_NR(2, 31)
|
||||
#define AC97_GPIO_TXD IMX_GPIO_NR(2, 28)
|
||||
#define AC97_GPIO_RESET IMX_GPIO_NR(2, 0)
|
||||
#define SD1_GPIO_WP IMX_GPIO_NR(2, 23)
|
||||
#define SD1_GPIO_CD IMX_GPIO_NR(2, 24)
|
||||
|
||||
static void pcm043_ac97_warm_reset(struct snd_ac97 *ac97)
|
||||
{
|
||||
|
@ -346,6 +351,11 @@ static int __init pcm043_otg_mode(char *options)
|
|||
}
|
||||
__setup("otg_mode=", pcm043_otg_mode);
|
||||
|
||||
static struct esdhc_platform_data sd1_pdata = {
|
||||
.wp_gpio = SD1_GPIO_WP,
|
||||
.cd_gpio = SD1_GPIO_CD,
|
||||
};
|
||||
|
||||
/*
|
||||
* Board specific initialization.
|
||||
*/
|
||||
|
@ -395,7 +405,7 @@ static void __init pcm043_init(void)
|
|||
imx35_add_fsl_usb2_udc(&otg_device_pdata);
|
||||
|
||||
imx35_add_flexcan1(NULL);
|
||||
imx35_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx35_add_sdhci_esdhc_imx(0, &sd1_pdata);
|
||||
}
|
||||
|
||||
static void __init pcm043_timer_init(void)
|
||||
|
|
|
@ -165,6 +165,7 @@ config MACH_MX53_LOCO
|
|||
select IMX_HAVE_PLATFORM_IMX_I2C
|
||||
select IMX_HAVE_PLATFORM_IMX_UART
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
select IMX_HAVE_PLATFORM_GPIO_KEYS
|
||||
help
|
||||
Include support for MX53 LOCO platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
|
||||
# Object file lists.
|
||||
obj-y := cpu.o mm.o clock-mx51-mx53.o devices.o ehci.o
|
||||
obj-y := cpu.o mm.o clock-mx51-mx53.o devices.o ehci.o system.o
|
||||
obj-$(CONFIG_SOC_IMX50) += mm-mx50.o
|
||||
|
||||
obj-$(CONFIG_CPU_FREQ_IMX) += cpu_op-mx51.o
|
||||
|
|
|
@ -228,13 +228,12 @@ static inline void babbage_fec_reset(void)
|
|||
int ret;
|
||||
|
||||
/* reset FEC PHY */
|
||||
ret = gpio_request(BABBAGE_FEC_PHY_RESET, "fec-phy-reset");
|
||||
ret = gpio_request_one(BABBAGE_FEC_PHY_RESET,
|
||||
GPIOF_OUT_INIT_LOW, "fec-phy-reset");
|
||||
if (ret) {
|
||||
printk(KERN_ERR"failed to get GPIO_FEC_PHY_RESET: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
gpio_direction_output(BABBAGE_FEC_PHY_RESET, 0);
|
||||
gpio_set_value(BABBAGE_FEC_PHY_RESET, 0);
|
||||
msleep(1);
|
||||
gpio_set_value(BABBAGE_FEC_PHY_RESET, 1);
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include <mach/imx-uart.h>
|
||||
#include <mach/iomux-mx53.h>
|
||||
|
||||
#define SMD_FEC_PHY_RST IMX_GPIO_NR(7, 6)
|
||||
#define MX53_EVK_FEC_PHY_RST IMX_GPIO_NR(7, 6)
|
||||
#define EVK_ECSPI1_CS0 IMX_GPIO_NR(2, 30)
|
||||
#define EVK_ECSPI1_CS1 IMX_GPIO_NR(3, 19)
|
||||
|
||||
|
@ -82,15 +82,14 @@ static inline void mx53_evk_fec_reset(void)
|
|||
int ret;
|
||||
|
||||
/* reset FEC PHY */
|
||||
ret = gpio_request(SMD_FEC_PHY_RST, "fec-phy-reset");
|
||||
ret = gpio_request_one(MX53_EVK_FEC_PHY_RST, GPIOF_OUT_INIT_LOW,
|
||||
"fec-phy-reset");
|
||||
if (ret) {
|
||||
printk(KERN_ERR"failed to get GPIO_FEC_PHY_RESET: %d\n", ret);
|
||||
return;
|
||||
}
|
||||
gpio_direction_output(SMD_FEC_PHY_RST, 0);
|
||||
gpio_set_value(SMD_FEC_PHY_RST, 0);
|
||||
msleep(1);
|
||||
gpio_set_value(SMD_FEC_PHY_RST, 1);
|
||||
gpio_set_value(MX53_EVK_FEC_PHY_RST, 1);
|
||||
}
|
||||
|
||||
static struct fec_platform_data mx53_evk_fec_pdata = {
|
||||
|
|
|
@ -36,6 +36,9 @@
|
|||
#include "crm_regs.h"
|
||||
#include "devices-imx53.h"
|
||||
|
||||
#define MX53_LOCO_POWER IMX_GPIO_NR(1, 8)
|
||||
#define MX53_LOCO_UI1 IMX_GPIO_NR(2, 14)
|
||||
#define MX53_LOCO_UI2 IMX_GPIO_NR(2, 15)
|
||||
#define LOCO_FEC_PHY_RST IMX_GPIO_NR(7, 6)
|
||||
|
||||
static iomux_v3_cfg_t mx53_loco_pads[] = {
|
||||
|
@ -180,6 +183,27 @@ static iomux_v3_cfg_t mx53_loco_pads[] = {
|
|||
MX53_PAD_GPIO_8__GPIO1_8,
|
||||
};
|
||||
|
||||
#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake) \
|
||||
{ \
|
||||
.gpio = gpio_num, \
|
||||
.type = EV_KEY, \
|
||||
.code = ev_code, \
|
||||
.active_low = act_low, \
|
||||
.desc = "btn " descr, \
|
||||
.wakeup = wake, \
|
||||
}
|
||||
|
||||
static const struct gpio_keys_button loco_buttons[] __initconst = {
|
||||
GPIO_BUTTON(MX53_LOCO_POWER, KEY_POWER, 1, "power", 0),
|
||||
GPIO_BUTTON(MX53_LOCO_UI1, KEY_VOLUMEUP, 1, "volume-up", 0),
|
||||
GPIO_BUTTON(MX53_LOCO_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0),
|
||||
};
|
||||
|
||||
static const struct gpio_keys_platform_data loco_button_data __initconst = {
|
||||
.buttons = loco_buttons,
|
||||
.nbuttons = ARRAY_SIZE(loco_buttons),
|
||||
};
|
||||
|
||||
static inline void mx53_loco_fec_reset(void)
|
||||
{
|
||||
int ret;
|
||||
|
@ -215,6 +239,7 @@ static void __init mx53_loco_board_init(void)
|
|||
imx53_add_imx_i2c(1, &mx53_loco_i2c_data);
|
||||
imx53_add_sdhci_esdhc_imx(0, NULL);
|
||||
imx53_add_sdhci_esdhc_imx(2, NULL);
|
||||
imx_add_gpio_keys(&loco_button_data);
|
||||
}
|
||||
|
||||
static void __init mx53_loco_timer_init(void)
|
||||
|
|
|
@ -865,6 +865,13 @@ static struct clk aips_tz2_clk = {
|
|||
.disable = _clk_ccgr_disable_inwait,
|
||||
};
|
||||
|
||||
static struct clk gpc_dvfs_clk = {
|
||||
.enable_reg = MXC_CCM_CCGR5,
|
||||
.enable_shift = MXC_CCM_CCGRx_CG12_OFFSET,
|
||||
.enable = _clk_ccgr_enable,
|
||||
.disable = _clk_ccgr_disable,
|
||||
};
|
||||
|
||||
static struct clk gpt_32k_clk = {
|
||||
.id = 0,
|
||||
.parent = &ckil_clk,
|
||||
|
@ -1448,6 +1455,7 @@ static struct clk_lookup mx51_lookups[] = {
|
|||
_REGISTER_CLOCK("imx-ipuv3", NULL, ipu_clk)
|
||||
_REGISTER_CLOCK("imx-ipuv3", "di0", ipu_di0_clk)
|
||||
_REGISTER_CLOCK("imx-ipuv3", "di1", ipu_di1_clk)
|
||||
_REGISTER_CLOCK(NULL, "gpc_dvfs", gpc_dvfs_clk)
|
||||
};
|
||||
|
||||
static struct clk_lookup mx53_lookups[] = {
|
||||
|
@ -1511,6 +1519,7 @@ int __init mx51_clocks_init(unsigned long ckil, unsigned long osc,
|
|||
clk_enable(&iim_clk);
|
||||
mx51_revision();
|
||||
clk_disable(&iim_clk);
|
||||
mx51_display_revision();
|
||||
|
||||
/* move usb_phy_clk to 24MHz */
|
||||
clk_set_parent(&usb_phy1_clk, &osc_clk);
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
static int cpu_silicon_rev = -1;
|
||||
|
||||
#define IIM_SREV 0x24
|
||||
#define MX50_HW_ADADIG_DIGPROG 0xB0
|
||||
|
||||
static int get_mx51_srev(void)
|
||||
{
|
||||
|
@ -51,6 +52,26 @@ int mx51_revision(void)
|
|||
}
|
||||
EXPORT_SYMBOL(mx51_revision);
|
||||
|
||||
void mx51_display_revision(void)
|
||||
{
|
||||
int rev;
|
||||
char *srev;
|
||||
rev = mx51_revision();
|
||||
|
||||
switch (rev) {
|
||||
case IMX_CHIP_REVISION_2_0:
|
||||
srev = IMX_CHIP_REVISION_2_0_STRING;
|
||||
break;
|
||||
case IMX_CHIP_REVISION_3_0:
|
||||
srev = IMX_CHIP_REVISION_3_0_STRING;
|
||||
break;
|
||||
default:
|
||||
srev = IMX_CHIP_REVISION_UNKNOWN_STRING;
|
||||
}
|
||||
printk(KERN_INFO "CPU identified as i.MX51, silicon rev %s\n", srev);
|
||||
}
|
||||
EXPORT_SYMBOL(mx51_display_revision);
|
||||
|
||||
#ifdef CONFIG_NEON
|
||||
|
||||
/*
|
||||
|
@ -107,6 +128,44 @@ int mx53_revision(void)
|
|||
}
|
||||
EXPORT_SYMBOL(mx53_revision);
|
||||
|
||||
static int get_mx50_srev(void)
|
||||
{
|
||||
void __iomem *anatop = ioremap(MX50_ANATOP_BASE_ADDR, SZ_8K);
|
||||
u32 rev;
|
||||
|
||||
if (!anatop) {
|
||||
cpu_silicon_rev = -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
rev = readl(anatop + MX50_HW_ADADIG_DIGPROG);
|
||||
rev &= 0xff;
|
||||
|
||||
iounmap(anatop);
|
||||
if (rev == 0x0)
|
||||
return IMX_CHIP_REVISION_1_0;
|
||||
else if (rev == 0x1)
|
||||
return IMX_CHIP_REVISION_1_1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns:
|
||||
* the silicon revision of the cpu
|
||||
* -EINVAL - not a mx50
|
||||
*/
|
||||
int mx50_revision(void)
|
||||
{
|
||||
if (!cpu_is_mx50())
|
||||
return -EINVAL;
|
||||
|
||||
if (cpu_silicon_rev == -1)
|
||||
cpu_silicon_rev = get_mx50_srev();
|
||||
|
||||
return cpu_silicon_rev;
|
||||
}
|
||||
EXPORT_SYMBOL(mx50_revision);
|
||||
|
||||
static int __init post_cpu_init(void)
|
||||
{
|
||||
unsigned int reg;
|
||||
|
|
|
@ -67,6 +67,10 @@ static iomux_v3_cfg_t eukrea_mbimxsd_pads[] = {
|
|||
MX51_PAD_SD1_DATA1__SD1_DATA1,
|
||||
MX51_PAD_SD1_DATA2__SD1_DATA2,
|
||||
MX51_PAD_SD1_DATA3__SD1_DATA3,
|
||||
/* SD1 CD */
|
||||
_MX51_PAD_GPIO1_0__SD1_CD | MUX_PAD_CTRL(PAD_CTL_PUS_22K_UP |
|
||||
PAD_CTL_PKE | PAD_CTL_SRE_FAST |
|
||||
PAD_CTL_DSE_HIGH | PAD_CTL_PUE | PAD_CTL_HYS),
|
||||
};
|
||||
|
||||
#define GPIO_LED1 IMX_GPIO_NR(3, 30)
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include "devices-imx51.h"
|
||||
#include "devices.h"
|
||||
|
|
84
arch/arm/mach-mx5/system.c
Normal file
84
arch/arm/mach-mx5/system.c
Normal file
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* Copyright (C) 2011 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The code contained herein is licensed under the GNU General Public
|
||||
* License. You may obtain a copy of the GNU General Public License
|
||||
* Version 2 or later at the following locations:
|
||||
*
|
||||
* http://www.opensource.org/licenses/gpl-license.html
|
||||
* http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <mach/hardware.h>
|
||||
#include "crm_regs.h"
|
||||
|
||||
/* set cpu low power mode before WFI instruction. This function is called
|
||||
* mx5 because it can be used for mx50, mx51, and mx53.*/
|
||||
void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode)
|
||||
{
|
||||
u32 plat_lpc, arm_srpgcr, ccm_clpcr;
|
||||
u32 empgc0, empgc1;
|
||||
int stop_mode = 0;
|
||||
|
||||
/* always allow platform to issue a deep sleep mode request */
|
||||
plat_lpc = __raw_readl(MXC_CORTEXA8_PLAT_LPC) &
|
||||
~(MXC_CORTEXA8_PLAT_LPC_DSM);
|
||||
ccm_clpcr = __raw_readl(MXC_CCM_CLPCR) & ~(MXC_CCM_CLPCR_LPM_MASK);
|
||||
arm_srpgcr = __raw_readl(MXC_SRPG_ARM_SRPGCR) & ~(MXC_SRPGCR_PCR);
|
||||
empgc0 = __raw_readl(MXC_SRPG_EMPGC0_SRPGCR) & ~(MXC_SRPGCR_PCR);
|
||||
empgc1 = __raw_readl(MXC_SRPG_EMPGC1_SRPGCR) & ~(MXC_SRPGCR_PCR);
|
||||
|
||||
switch (mode) {
|
||||
case WAIT_CLOCKED:
|
||||
break;
|
||||
case WAIT_UNCLOCKED:
|
||||
ccm_clpcr |= 0x1 << MXC_CCM_CLPCR_LPM_OFFSET;
|
||||
break;
|
||||
case WAIT_UNCLOCKED_POWER_OFF:
|
||||
case STOP_POWER_OFF:
|
||||
plat_lpc |= MXC_CORTEXA8_PLAT_LPC_DSM
|
||||
| MXC_CORTEXA8_PLAT_LPC_DBG_DSM;
|
||||
if (mode == WAIT_UNCLOCKED_POWER_OFF) {
|
||||
ccm_clpcr |= 0x1 << MXC_CCM_CLPCR_LPM_OFFSET;
|
||||
ccm_clpcr &= ~MXC_CCM_CLPCR_VSTBY;
|
||||
ccm_clpcr &= ~MXC_CCM_CLPCR_SBYOS;
|
||||
stop_mode = 0;
|
||||
} else {
|
||||
ccm_clpcr |= 0x2 << MXC_CCM_CLPCR_LPM_OFFSET;
|
||||
ccm_clpcr |= 0x3 << MXC_CCM_CLPCR_STBY_COUNT_OFFSET;
|
||||
ccm_clpcr |= MXC_CCM_CLPCR_VSTBY;
|
||||
ccm_clpcr |= MXC_CCM_CLPCR_SBYOS;
|
||||
stop_mode = 1;
|
||||
}
|
||||
arm_srpgcr |= MXC_SRPGCR_PCR;
|
||||
|
||||
if (tzic_enable_wake(1) != 0)
|
||||
return;
|
||||
break;
|
||||
case STOP_POWER_ON:
|
||||
ccm_clpcr |= 0x2 << MXC_CCM_CLPCR_LPM_OFFSET;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING "UNKNOWN cpu power mode: %d\n", mode);
|
||||
return;
|
||||
}
|
||||
|
||||
__raw_writel(plat_lpc, MXC_CORTEXA8_PLAT_LPC);
|
||||
__raw_writel(ccm_clpcr, MXC_CCM_CLPCR);
|
||||
__raw_writel(arm_srpgcr, MXC_SRPG_ARM_SRPGCR);
|
||||
|
||||
/* Enable NEON SRPG for all but MX50TO1.0. */
|
||||
if (mx50_revision() != IMX_CHIP_REVISION_1_0)
|
||||
__raw_writel(arm_srpgcr, MXC_SRPG_NEON_SRPGCR);
|
||||
|
||||
if (stop_mode) {
|
||||
empgc0 |= MXC_SRPGCR_PCR;
|
||||
empgc1 |= MXC_SRPGCR_PCR;
|
||||
|
||||
__raw_writel(empgc0, MXC_SRPG_EMPGC0_SRPGCR);
|
||||
__raw_writel(empgc1, MXC_SRPG_EMPGC1_SRPGCR);
|
||||
}
|
||||
}
|
|
@ -22,6 +22,7 @@ config MACH_MX23EVK
|
|||
select SOC_IMX23
|
||||
select MXS_HAVE_AMBA_DUART
|
||||
select MXS_HAVE_PLATFORM_AUART
|
||||
select MXS_HAVE_PLATFORM_MXS_MMC
|
||||
select MXS_HAVE_PLATFORM_MXSFB
|
||||
default y
|
||||
help
|
||||
|
@ -35,6 +36,7 @@ config MACH_MX28EVK
|
|||
select MXS_HAVE_PLATFORM_AUART
|
||||
select MXS_HAVE_PLATFORM_FEC
|
||||
select MXS_HAVE_PLATFORM_FLEXCAN
|
||||
select MXS_HAVE_PLATFORM_MXS_MMC
|
||||
select MXS_HAVE_PLATFORM_MXSFB
|
||||
select MXS_OCOTP
|
||||
default y
|
||||
|
|
|
@ -521,6 +521,15 @@ static int clk_misc_init(void)
|
|||
__raw_writel(BM_CLKCTRL_CPU_INTERRUPT_WAIT,
|
||||
CLKCTRL_BASE_ADDR + HW_CLKCTRL_CPU_SET);
|
||||
|
||||
/*
|
||||
* 480 MHz seems too high to be ssp clock source directly,
|
||||
* so set frac to get a 288 MHz ref_io.
|
||||
*/
|
||||
reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC);
|
||||
reg &= ~BM_CLKCTRL_FRAC_IOFRAC;
|
||||
reg |= 30 << BP_CLKCTRL_FRAC_IOFRAC;
|
||||
__raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -528,6 +537,12 @@ int __init mx23_clocks_init(void)
|
|||
{
|
||||
clk_misc_init();
|
||||
|
||||
/*
|
||||
* source ssp clock from ref_io than ref_xtal,
|
||||
* as ref_xtal only provides 24 MHz as maximum.
|
||||
*/
|
||||
clk_set_parent(&ssp_clk, &ref_io_clk);
|
||||
|
||||
clk_enable(&cpu_clk);
|
||||
clk_enable(&hbus_clk);
|
||||
clk_enable(&xbus_clk);
|
||||
|
|
|
@ -618,6 +618,8 @@ static struct clk_lookup lookups[] = {
|
|||
_REGISTER_CLOCK("pll2", NULL, pll2_clk)
|
||||
_REGISTER_CLOCK("mxs-dma-apbh", NULL, hbus_clk)
|
||||
_REGISTER_CLOCK("mxs-dma-apbx", NULL, xbus_clk)
|
||||
_REGISTER_CLOCK("mxs-mmc.0", NULL, ssp0_clk)
|
||||
_REGISTER_CLOCK("mxs-mmc.1", NULL, ssp1_clk)
|
||||
_REGISTER_CLOCK("flexcan.0", NULL, can0_clk)
|
||||
_REGISTER_CLOCK("flexcan.1", NULL, can1_clk)
|
||||
_REGISTER_CLOCK(NULL, "usb0", usb0_clk)
|
||||
|
@ -737,6 +739,15 @@ static int clk_misc_init(void)
|
|||
reg |= BM_CLKCTRL_ENET_CLK_OUT_EN;
|
||||
__raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_ENET);
|
||||
|
||||
/*
|
||||
* 480 MHz seems too high to be ssp clock source directly,
|
||||
* so set frac0 to get a 288 MHz ref_io0.
|
||||
*/
|
||||
reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC0);
|
||||
reg &= ~BM_CLKCTRL_FRAC0_IO0FRAC;
|
||||
reg |= 30 << BP_CLKCTRL_FRAC0_IO0FRAC;
|
||||
__raw_writel(reg, CLKCTRL_BASE_ADDR + HW_CLKCTRL_FRAC0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -744,6 +755,13 @@ int __init mx28_clocks_init(void)
|
|||
{
|
||||
clk_misc_init();
|
||||
|
||||
/*
|
||||
* source ssp clock from ref_io0 than ref_xtal,
|
||||
* as ref_xtal only provides 24 MHz as maximum.
|
||||
*/
|
||||
clk_set_parent(&ssp0_clk, &ref_io0_clk);
|
||||
clk_set_parent(&ssp1_clk, &ref_io0_clk);
|
||||
|
||||
clk_enable(&cpu_clk);
|
||||
clk_enable(&hbus_clk);
|
||||
clk_enable(&xbus_clk);
|
||||
|
|
|
@ -21,6 +21,10 @@ extern const struct mxs_auart_data mx23_auart_data[] __initconst;
|
|||
#define mx23_add_auart0() mx23_add_auart(0)
|
||||
#define mx23_add_auart1() mx23_add_auart(1)
|
||||
|
||||
extern const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst;
|
||||
#define mx23_add_mxs_mmc(id, pdata) \
|
||||
mxs_add_mxs_mmc(&mx23_mxs_mmc_data[id], pdata)
|
||||
|
||||
#define mx23_add_mxs_pwm(id) mxs_add_mxs_pwm(MX23_PWM_BASE_ADDR, id)
|
||||
|
||||
struct platform_device *__init mx23_add_mxsfb(
|
||||
|
|
|
@ -37,6 +37,10 @@ extern const struct mxs_flexcan_data mx28_flexcan_data[] __initconst;
|
|||
extern const struct mxs_i2c_data mx28_mxs_i2c_data[] __initconst;
|
||||
#define mx28_add_mxs_i2c(id) mxs_add_mxs_i2c(&mx28_mxs_i2c_data[id])
|
||||
|
||||
extern const struct mxs_mxs_mmc_data mx28_mxs_mmc_data[] __initconst;
|
||||
#define mx28_add_mxs_mmc(id, pdata) \
|
||||
mxs_add_mxs_mmc(&mx28_mxs_mmc_data[id], pdata)
|
||||
|
||||
#define mx28_add_mxs_pwm(id) mxs_add_mxs_pwm(MX28_PWM_BASE_ADDR, id)
|
||||
|
||||
struct platform_device *__init mx28_add_mxsfb(
|
||||
|
|
|
@ -15,6 +15,9 @@ config MXS_HAVE_PLATFORM_FLEXCAN
|
|||
config MXS_HAVE_PLATFORM_MXS_I2C
|
||||
bool
|
||||
|
||||
config MXS_HAVE_PLATFORM_MXS_MMC
|
||||
bool
|
||||
|
||||
config MXS_HAVE_PLATFORM_MXS_PWM
|
||||
bool
|
||||
|
||||
|
|
|
@ -4,5 +4,6 @@ obj-y += platform-dma.o
|
|||
obj-$(CONFIG_MXS_HAVE_PLATFORM_FEC) += platform-fec.o
|
||||
obj-$(CONFIG_MXS_HAVE_PLATFORM_FLEXCAN) += platform-flexcan.o
|
||||
obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_I2C) += platform-mxs-i2c.o
|
||||
obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_MMC) += platform-mxs-mmc.o
|
||||
obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_PWM) += platform-mxs-pwm.o
|
||||
obj-$(CONFIG_MXS_HAVE_PLATFORM_MXSFB) += platform-mxsfb.o
|
||||
|
|
73
arch/arm/mach-mxs/devices/platform-mxs-mmc.c
Normal file
73
arch/arm/mach-mxs/devices/platform-mxs-mmc.c
Normal file
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* Copyright (C) 2010 Pengutronix
|
||||
* Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
|
||||
*
|
||||
* Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License version 2 as published by the
|
||||
* Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <mach/mx23.h>
|
||||
#include <mach/mx28.h>
|
||||
#include <mach/devices-common.h>
|
||||
|
||||
#define mxs_mxs_mmc_data_entry_single(soc, _id, hwid) \
|
||||
{ \
|
||||
.id = _id, \
|
||||
.iobase = soc ## _SSP ## hwid ## _BASE_ADDR, \
|
||||
.dma = soc ## _DMA_SSP ## hwid, \
|
||||
.irq_err = soc ## _INT_SSP ## hwid ## _ERROR, \
|
||||
.irq_dma = soc ## _INT_SSP ## hwid ## _DMA, \
|
||||
}
|
||||
|
||||
#define mxs_mxs_mmc_data_entry(soc, _id, hwid) \
|
||||
[_id] = mxs_mxs_mmc_data_entry_single(soc, _id, hwid)
|
||||
|
||||
|
||||
#ifdef CONFIG_SOC_IMX23
|
||||
const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst = {
|
||||
mxs_mxs_mmc_data_entry(MX23, 0, 1),
|
||||
mxs_mxs_mmc_data_entry(MX23, 1, 2),
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SOC_IMX28
|
||||
const struct mxs_mxs_mmc_data mx28_mxs_mmc_data[] __initconst = {
|
||||
mxs_mxs_mmc_data_entry(MX28, 0, 0),
|
||||
mxs_mxs_mmc_data_entry(MX28, 1, 1),
|
||||
};
|
||||
#endif
|
||||
|
||||
struct platform_device *__init mxs_add_mxs_mmc(
|
||||
const struct mxs_mxs_mmc_data *data,
|
||||
const struct mxs_mmc_platform_data *pdata)
|
||||
{
|
||||
struct resource res[] = {
|
||||
{
|
||||
.start = data->iobase,
|
||||
.end = data->iobase + SZ_8K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = data->dma,
|
||||
.end = data->dma,
|
||||
.flags = IORESOURCE_DMA,
|
||||
}, {
|
||||
.start = data->irq_err,
|
||||
.end = data->irq_err,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}, {
|
||||
.start = data->irq_dma,
|
||||
.end = data->irq_dma,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
return mxs_add_platform_device("mxs-mmc", data->id,
|
||||
res, ARRAY_SIZE(res), pdata, sizeof(*pdata));
|
||||
}
|
|
@ -73,6 +73,19 @@ struct mxs_i2c_data {
|
|||
};
|
||||
struct platform_device * __init mxs_add_mxs_i2c(const struct mxs_i2c_data *data);
|
||||
|
||||
/* mmc */
|
||||
#include <mach/mmc.h>
|
||||
struct mxs_mxs_mmc_data {
|
||||
int id;
|
||||
resource_size_t iobase;
|
||||
resource_size_t dma;
|
||||
resource_size_t irq_err;
|
||||
resource_size_t irq_dma;
|
||||
};
|
||||
struct platform_device *__init mxs_add_mxs_mmc(
|
||||
const struct mxs_mxs_mmc_data *data,
|
||||
const struct mxs_mmc_platform_data *pdata);
|
||||
|
||||
/* pwm */
|
||||
struct platform_device *__init mxs_add_mxs_pwm(
|
||||
resource_size_t iobase, int id);
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
|
||||
#define MX23EVK_LCD_ENABLE MXS_GPIO_NR(1, 18)
|
||||
#define MX23EVK_BL_ENABLE MXS_GPIO_NR(1, 28)
|
||||
#define MX23EVK_MMC0_WRITE_PROTECT MXS_GPIO_NR(1, 30)
|
||||
#define MX23EVK_MMC0_SLOT_POWER MXS_GPIO_NR(1, 29)
|
||||
|
||||
static const iomux_cfg_t mx23evk_pads[] __initconst = {
|
||||
/* duart */
|
||||
|
@ -73,6 +75,36 @@ static const iomux_cfg_t mx23evk_pads[] __initconst = {
|
|||
MX23_PAD_LCD_RESET__GPIO_1_18 | MXS_PAD_CTRL,
|
||||
/* backlight control */
|
||||
MX23_PAD_PWM2__GPIO_1_28 | MXS_PAD_CTRL,
|
||||
|
||||
/* mmc */
|
||||
MX23_PAD_SSP1_DATA0__SSP1_DATA0 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX23_PAD_SSP1_DATA1__SSP1_DATA1 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX23_PAD_SSP1_DATA2__SSP1_DATA2 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX23_PAD_SSP1_DATA3__SSP1_DATA3 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX23_PAD_GPMI_D08__SSP1_DATA4 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX23_PAD_GPMI_D09__SSP1_DATA5 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX23_PAD_GPMI_D10__SSP1_DATA6 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX23_PAD_GPMI_D11__SSP1_DATA7 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX23_PAD_SSP1_CMD__SSP1_CMD |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX23_PAD_SSP1_DETECT__SSP1_DETECT |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
MX23_PAD_SSP1_SCK__SSP1_SCK |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
/* write protect */
|
||||
MX23_PAD_PWM4__GPIO_1_30 |
|
||||
(MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
/* slot power enable */
|
||||
MX23_PAD_PWM3__GPIO_1_29 |
|
||||
(MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
};
|
||||
|
||||
/* mxsfb (lcdif) */
|
||||
|
@ -101,6 +133,11 @@ static const struct mxsfb_platform_data mx23evk_mxsfb_pdata __initconst = {
|
|||
.ld_intf_width = STMLCDIF_24BIT,
|
||||
};
|
||||
|
||||
static struct mxs_mmc_platform_data mx23evk_mmc_pdata __initdata = {
|
||||
.wp_gpio = MX23EVK_MMC0_WRITE_PROTECT,
|
||||
.flags = SLOTF_8_BIT_CAPABLE,
|
||||
};
|
||||
|
||||
static void __init mx23evk_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
@ -110,6 +147,13 @@ static void __init mx23evk_init(void)
|
|||
mx23_add_duart();
|
||||
mx23_add_auart0();
|
||||
|
||||
/* power on mmc slot by writing 0 to the gpio */
|
||||
ret = gpio_request_one(MX23EVK_MMC0_SLOT_POWER, GPIOF_DIR_OUT,
|
||||
"mmc0-slot-power");
|
||||
if (ret)
|
||||
pr_warn("failed to request gpio mmc0-slot-power: %d\n", ret);
|
||||
mx23_add_mxs_mmc(0, &mx23evk_mmc_pdata);
|
||||
|
||||
ret = gpio_request_one(MX23EVK_LCD_ENABLE, GPIOF_DIR_OUT, "lcd-enable");
|
||||
if (ret)
|
||||
pr_warn("failed to request gpio lcd-enable: %d\n", ret);
|
||||
|
|
|
@ -34,6 +34,11 @@
|
|||
#define MX28EVK_LCD_ENABLE MXS_GPIO_NR(3, 30)
|
||||
#define MX28EVK_FEC_PHY_RESET MXS_GPIO_NR(4, 13)
|
||||
|
||||
#define MX28EVK_MMC0_WRITE_PROTECT MXS_GPIO_NR(2, 12)
|
||||
#define MX28EVK_MMC1_WRITE_PROTECT MXS_GPIO_NR(0, 28)
|
||||
#define MX28EVK_MMC0_SLOT_POWER MXS_GPIO_NR(3, 28)
|
||||
#define MX28EVK_MMC1_SLOT_POWER MXS_GPIO_NR(3, 29)
|
||||
|
||||
static const iomux_cfg_t mx28evk_pads[] __initconst = {
|
||||
/* duart */
|
||||
MX28_PAD_PWM0__DUART_RX | MXS_PAD_CTRL,
|
||||
|
@ -115,6 +120,65 @@ static const iomux_cfg_t mx28evk_pads[] __initconst = {
|
|||
MX28_PAD_LCD_RESET__GPIO_3_30 | MXS_PAD_CTRL,
|
||||
/* backlight control */
|
||||
MX28_PAD_PWM2__GPIO_3_18 | MXS_PAD_CTRL,
|
||||
/* mmc0 */
|
||||
MX28_PAD_SSP0_DATA0__SSP0_D0 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA1__SSP0_D1 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA2__SSP0_D2 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA3__SSP0_D3 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA4__SSP0_D4 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA5__SSP0_D5 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA6__SSP0_D6 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DATA7__SSP0_D7 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_CMD__SSP0_CMD |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
MX28_PAD_SSP0_SCK__SSP0_SCK |
|
||||
(MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
/* write protect */
|
||||
MX28_PAD_SSP1_SCK__GPIO_2_12 |
|
||||
(MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
/* slot power enable */
|
||||
MX28_PAD_PWM3__GPIO_3_28 |
|
||||
(MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
|
||||
/* mmc1 */
|
||||
MX28_PAD_GPMI_D00__SSP1_D0 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_GPMI_D01__SSP1_D1 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_GPMI_D02__SSP1_D2 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_GPMI_D03__SSP1_D3 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_GPMI_D04__SSP1_D4 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_GPMI_D05__SSP1_D5 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_GPMI_D06__SSP1_D6 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_GPMI_D07__SSP1_D7 |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_GPMI_RDY1__SSP1_CMD |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
|
||||
MX28_PAD_GPMI_RDY0__SSP1_CARD_DETECT |
|
||||
(MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
MX28_PAD_GPMI_WRN__SSP1_SCK |
|
||||
(MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
/* write protect */
|
||||
MX28_PAD_GPMI_RESETN__GPIO_0_28 |
|
||||
(MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
/* slot power enable */
|
||||
MX28_PAD_PWM4__GPIO_3_29 |
|
||||
(MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
|
||||
};
|
||||
|
||||
/* fec */
|
||||
|
@ -258,6 +322,18 @@ static const struct mxsfb_platform_data mx28evk_mxsfb_pdata __initconst = {
|
|||
.ld_intf_width = STMLCDIF_24BIT,
|
||||
};
|
||||
|
||||
static struct mxs_mmc_platform_data mx28evk_mmc_pdata[] __initdata = {
|
||||
{
|
||||
/* mmc0 */
|
||||
.wp_gpio = MX28EVK_MMC0_WRITE_PROTECT,
|
||||
.flags = SLOTF_8_BIT_CAPABLE,
|
||||
}, {
|
||||
/* mmc1 */
|
||||
.wp_gpio = MX28EVK_MMC1_WRITE_PROTECT,
|
||||
.flags = SLOTF_8_BIT_CAPABLE,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init mx28evk_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
@ -297,6 +373,19 @@ static void __init mx28evk_init(void)
|
|||
gpio_set_value(MX28EVK_BL_ENABLE, 1);
|
||||
|
||||
mx28_add_mxsfb(&mx28evk_mxsfb_pdata);
|
||||
|
||||
/* power on mmc slot by writing 0 to the gpio */
|
||||
ret = gpio_request_one(MX28EVK_MMC0_SLOT_POWER, GPIOF_DIR_OUT,
|
||||
"mmc0-slot-power");
|
||||
if (ret)
|
||||
pr_warn("failed to request gpio mmc0-slot-power: %d\n", ret);
|
||||
mx28_add_mxs_mmc(0, &mx28evk_mmc_pdata[0]);
|
||||
|
||||
ret = gpio_request_one(MX28EVK_MMC1_SLOT_POWER, GPIOF_DIR_OUT,
|
||||
"mmc1-slot-power");
|
||||
if (ret)
|
||||
pr_warn("failed to request gpio mmc1-slot-power: %d\n", ret);
|
||||
mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
|
||||
}
|
||||
|
||||
static void __init mx28evk_timer_init(void)
|
||||
|
|
|
@ -45,7 +45,7 @@ static const iomux_cfg_t tx28_fec_gpio_pads[] __initconst = {
|
|||
};
|
||||
|
||||
#define FEC_MODE (MXS_PAD_8MA | MXS_PAD_PULLUP | MXS_PAD_3V3)
|
||||
static const iomux_cfg_t tx28_fec_pads[] __initconst = {
|
||||
static const iomux_cfg_t tx28_fec0_pads[] __initconst = {
|
||||
MX28_PAD_ENET0_MDC__ENET0_MDC | FEC_MODE,
|
||||
MX28_PAD_ENET0_MDIO__ENET0_MDIO | FEC_MODE,
|
||||
MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | FEC_MODE,
|
||||
|
@ -57,7 +57,20 @@ static const iomux_cfg_t tx28_fec_pads[] __initconst = {
|
|||
MX28_PAD_ENET_CLK__CLKCTRL_ENET | FEC_MODE,
|
||||
};
|
||||
|
||||
static const struct fec_platform_data tx28_fec_data __initconst = {
|
||||
static const iomux_cfg_t tx28_fec1_pads[] __initconst = {
|
||||
MX28_PAD_ENET0_RXD2__ENET1_RXD0,
|
||||
MX28_PAD_ENET0_RXD3__ENET1_RXD1,
|
||||
MX28_PAD_ENET0_TXD2__ENET1_TXD0,
|
||||
MX28_PAD_ENET0_TXD3__ENET1_TXD1,
|
||||
MX28_PAD_ENET0_COL__ENET1_TX_EN,
|
||||
MX28_PAD_ENET0_CRS__ENET1_RX_EN,
|
||||
};
|
||||
|
||||
static struct fec_platform_data tx28_fec0_data = {
|
||||
.phy = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
static struct fec_platform_data tx28_fec1_data = {
|
||||
.phy = PHY_INTERFACE_MODE_RMII,
|
||||
};
|
||||
|
||||
|
@ -108,15 +121,15 @@ int __init tx28_add_fec0(void)
|
|||
pr_debug("%s: Deasserting FEC PHY RESET\n", __func__);
|
||||
gpio_set_value(TX28_FEC_PHY_RESET, 1);
|
||||
|
||||
ret = mxs_iomux_setup_multiple_pads(tx28_fec_pads,
|
||||
ARRAY_SIZE(tx28_fec_pads));
|
||||
ret = mxs_iomux_setup_multiple_pads(tx28_fec0_pads,
|
||||
ARRAY_SIZE(tx28_fec0_pads));
|
||||
if (ret) {
|
||||
pr_debug("%s: mxs_iomux_setup_multiple_pads() failed with rc: %d\n",
|
||||
__func__, ret);
|
||||
goto free_gpios;
|
||||
}
|
||||
pr_debug("%s: Registering FEC device\n", __func__);
|
||||
mx28_add_fec(0, &tx28_fec_data);
|
||||
pr_debug("%s: Registering FEC0 device\n", __func__);
|
||||
mx28_add_fec(0, &tx28_fec0_data);
|
||||
return 0;
|
||||
|
||||
free_gpios:
|
||||
|
@ -129,3 +142,19 @@ int __init tx28_add_fec0(void)
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int __init tx28_add_fec1(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mxs_iomux_setup_multiple_pads(tx28_fec1_pads,
|
||||
ARRAY_SIZE(tx28_fec1_pads));
|
||||
if (ret) {
|
||||
pr_debug("%s: mxs_iomux_setup_multiple_pads() failed with rc: %d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
pr_debug("%s: Registering FEC1 device\n", __func__);
|
||||
mx28_add_fec(1, &tx28_fec1_data);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -7,3 +7,4 @@
|
|||
* Free Software Foundation.
|
||||
*/
|
||||
int __init tx28_add_fec0(void);
|
||||
int __init tx28_add_fec1(void);
|
||||
|
|
|
@ -402,7 +402,7 @@ static void ts78xx_fpga_supports(void)
|
|||
/* enable devices if magic matches */
|
||||
switch ((ts78xx_fpga.id >> 8) & 0xffffff) {
|
||||
case TS7800_FPGA_MAGIC:
|
||||
printk(KERN_WARNING "TS-7800 FPGA: unrecognized revision 0x%.2x\n",
|
||||
pr_warning("TS-7800 FPGA: unrecognized revision 0x%.2x\n",
|
||||
ts78xx_fpga.id & 0xff);
|
||||
ts78xx_fpga.supports.ts_rtc.present = 1;
|
||||
ts78xx_fpga.supports.ts_nand.present = 1;
|
||||
|
@ -423,7 +423,7 @@ static int ts78xx_fpga_load_devices(void)
|
|||
if (ts78xx_fpga.supports.ts_rtc.present == 1) {
|
||||
tmp = ts78xx_ts_rtc_load();
|
||||
if (tmp) {
|
||||
printk(KERN_INFO "TS-78xx: RTC not registered\n");
|
||||
pr_info("TS-78xx: RTC not registered\n");
|
||||
ts78xx_fpga.supports.ts_rtc.present = 0;
|
||||
}
|
||||
ret |= tmp;
|
||||
|
@ -431,7 +431,7 @@ static int ts78xx_fpga_load_devices(void)
|
|||
if (ts78xx_fpga.supports.ts_nand.present == 1) {
|
||||
tmp = ts78xx_ts_nand_load();
|
||||
if (tmp) {
|
||||
printk(KERN_INFO "TS-78xx: NAND not registered\n");
|
||||
pr_info("TS-78xx: NAND not registered\n");
|
||||
ts78xx_fpga.supports.ts_nand.present = 0;
|
||||
}
|
||||
ret |= tmp;
|
||||
|
@ -439,7 +439,7 @@ static int ts78xx_fpga_load_devices(void)
|
|||
if (ts78xx_fpga.supports.ts_rng.present == 1) {
|
||||
tmp = ts78xx_ts_rng_load();
|
||||
if (tmp) {
|
||||
printk(KERN_INFO "TS-78xx: RNG not registered\n");
|
||||
pr_info("TS-78xx: RNG not registered\n");
|
||||
ts78xx_fpga.supports.ts_rng.present = 0;
|
||||
}
|
||||
ret |= tmp;
|
||||
|
@ -466,7 +466,7 @@ static int ts78xx_fpga_load(void)
|
|||
{
|
||||
ts78xx_fpga.id = readl(TS78XX_FPGA_REGS_VIRT_BASE);
|
||||
|
||||
printk(KERN_INFO "TS-78xx FPGA: magic=0x%.6x, rev=0x%.2x\n",
|
||||
pr_info("TS-78xx FPGA: magic=0x%.6x, rev=0x%.2x\n",
|
||||
(ts78xx_fpga.id >> 8) & 0xffffff,
|
||||
ts78xx_fpga.id & 0xff);
|
||||
|
||||
|
@ -494,7 +494,7 @@ static int ts78xx_fpga_unload(void)
|
|||
* UrJTAG SVN since r1381 can be used to reprogram the FPGA
|
||||
*/
|
||||
if (ts78xx_fpga.id != fpga_id) {
|
||||
printk(KERN_ERR "TS-78xx FPGA: magic/rev mismatch\n"
|
||||
pr_err("TS-78xx FPGA: magic/rev mismatch\n"
|
||||
"TS-78xx FPGA: was 0x%.6x/%.2x but now 0x%.6x/%.2x\n",
|
||||
(ts78xx_fpga.id >> 8) & 0xffffff, ts78xx_fpga.id & 0xff,
|
||||
(fpga_id >> 8) & 0xffffff, fpga_id & 0xff);
|
||||
|
@ -525,7 +525,7 @@ static ssize_t ts78xx_fpga_store(struct kobject *kobj,
|
|||
int value, ret;
|
||||
|
||||
if (ts78xx_fpga.state < 0) {
|
||||
printk(KERN_ERR "TS-78xx FPGA: borked, you must powercycle asap\n");
|
||||
pr_err("TS-78xx FPGA: borked, you must powercycle asap\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
@ -534,7 +534,7 @@ static ssize_t ts78xx_fpga_store(struct kobject *kobj,
|
|||
else if (strncmp(buf, "offline", sizeof("offline") - 1) == 0)
|
||||
value = 0;
|
||||
else {
|
||||
printk(KERN_ERR "ts78xx_fpga_store: Invalid value\n");
|
||||
pr_err("ts78xx_fpga_store: Invalid value\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -616,7 +616,7 @@ static void __init ts78xx_init(void)
|
|||
ret = ts78xx_fpga_load();
|
||||
ret = sysfs_create_file(power_kobj, &ts78xx_fpga_attr.attr);
|
||||
if (ret)
|
||||
printk(KERN_ERR "sysfs_create_file failed: %d\n", ret);
|
||||
pr_err("sysfs_create_file failed: %d\n", ret);
|
||||
}
|
||||
|
||||
MACHINE_START(TS78XX, "Technologic Systems TS-78xx SBC")
|
||||
|
|
|
@ -128,8 +128,8 @@ static int am200_init_gpio_regs(struct metronomefb_par *par)
|
|||
return 0;
|
||||
|
||||
err_req_gpio:
|
||||
while (i > 0)
|
||||
gpio_free(gpios[i--]);
|
||||
while (--i >= 0)
|
||||
gpio_free(gpios[i]);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -194,7 +194,7 @@ static struct notifier_block am200_fb_notif = {
|
|||
};
|
||||
|
||||
/* this gets called as part of our init. these steps must be done now so
|
||||
* that we can use set_pxa_fb_info */
|
||||
* that we can use pxa_set_fb_info */
|
||||
static void __init am200_presetup_fb(void)
|
||||
{
|
||||
int fw;
|
||||
|
@ -249,7 +249,7 @@ static void __init am200_presetup_fb(void)
|
|||
/* we divide since we told the LCD controller we're 16bpp */
|
||||
am200_fb_info.modes->xres /= 2;
|
||||
|
||||
set_pxa_fb_info(&am200_fb_info);
|
||||
pxa_set_fb_info(NULL, &am200_fb_info);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -125,10 +125,7 @@ static int am300_init_gpio_regs(struct broadsheetfb_par *par)
|
|||
if (err) {
|
||||
dev_err(&am300_device->dev, "failed requesting "
|
||||
"gpio %d, err=%d\n", i, err);
|
||||
while (i >= DB0_GPIO_PIN)
|
||||
gpio_free(i--);
|
||||
i = ARRAY_SIZE(gpios) - 1;
|
||||
goto err_req_gpio;
|
||||
goto err_req_gpio2;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,9 +156,13 @@ static int am300_init_gpio_regs(struct broadsheetfb_par *par)
|
|||
|
||||
return 0;
|
||||
|
||||
err_req_gpio2:
|
||||
while (--i >= DB0_GPIO_PIN)
|
||||
gpio_free(i);
|
||||
i = ARRAY_SIZE(gpios);
|
||||
err_req_gpio:
|
||||
while (i > 0)
|
||||
gpio_free(gpios[i--]);
|
||||
while (--i >= 0)
|
||||
gpio_free(gpios[i]);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -263,7 +263,7 @@ static void __init balloon3_lcd_init(void)
|
|||
}
|
||||
|
||||
balloon3_lcd_screen.pxafb_backlight_power = balloon3_backlight_power;
|
||||
set_pxa_fb_info(&balloon3_lcd_screen);
|
||||
pxa_set_fb_info(NULL, &balloon3_lcd_screen);
|
||||
return;
|
||||
|
||||
err2:
|
||||
|
|
|
@ -379,7 +379,7 @@ __setup("monitor=", cmx2xx_set_display);
|
|||
|
||||
static void __init cmx2xx_init_display(void)
|
||||
{
|
||||
set_pxa_fb_info(cmx2xx_display);
|
||||
pxa_set_fb_info(NULL, cmx2xx_display);
|
||||
}
|
||||
#else
|
||||
static inline void cmx2xx_init_display(void) {}
|
||||
|
|
|
@ -296,7 +296,7 @@ static struct pxafb_mach_info cm_x300_lcd = {
|
|||
|
||||
static void __init cm_x300_init_lcd(void)
|
||||
{
|
||||
set_pxa_fb_info(&cm_x300_lcd);
|
||||
pxa_set_fb_info(NULL, &cm_x300_lcd);
|
||||
}
|
||||
#else
|
||||
static inline void cm_x300_init_lcd(void) {}
|
||||
|
|
|
@ -175,7 +175,7 @@ static struct pxafb_mach_info income_lcd_screen = {
|
|||
|
||||
static void __init income_lcd_init(void)
|
||||
{
|
||||
set_pxa_fb_info(&income_lcd_screen);
|
||||
pxa_set_fb_info(NULL, &income_lcd_screen);
|
||||
}
|
||||
#else
|
||||
static inline void income_lcd_init(void) {}
|
||||
|
|
|
@ -105,7 +105,7 @@ void __init colibri_pxa3xx_init_lcd(int bl_pin)
|
|||
lcd_bl_pin = bl_pin;
|
||||
gpio_request(bl_pin, "lcd backlight");
|
||||
gpio_direction_output(bl_pin, 0);
|
||||
set_pxa_fb_info(&sharp_lq43_info);
|
||||
pxa_set_fb_info(NULL, &sharp_lq43_info);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -462,7 +462,6 @@ static struct pxaficp_platform_data corgi_ficp_platform_data = {
|
|||
* USB Device Controller
|
||||
*/
|
||||
static struct pxa2xx_udc_mach_info udc_info __initdata = {
|
||||
.gpio_vbus = -1,
|
||||
/* no connect GPIO; corgi can't tell connection status */
|
||||
.gpio_pullup = CORGI_GPIO_USB_PULLUP,
|
||||
};
|
||||
|
|
|
@ -90,7 +90,6 @@ void __init pxa_set_mci_info(struct pxamci_platform_data *info)
|
|||
|
||||
static struct pxa2xx_udc_mach_info pxa_udc_info = {
|
||||
.gpio_pullup = -1,
|
||||
.gpio_vbus = -1,
|
||||
};
|
||||
|
||||
void __init pxa_set_udc_info(struct pxa2xx_udc_mach_info *info)
|
||||
|
@ -188,16 +187,12 @@ struct platform_device pxa_device_fb = {
|
|||
.resource = pxafb_resources,
|
||||
};
|
||||
|
||||
void __init set_pxa_fb_info(struct pxafb_mach_info *info)
|
||||
void __init pxa_set_fb_info(struct device *parent, struct pxafb_mach_info *info)
|
||||
{
|
||||
pxa_device_fb.dev.parent = parent;
|
||||
pxa_register_device(&pxa_device_fb, info);
|
||||
}
|
||||
|
||||
void __init set_pxa_fb_parent(struct device *parent_dev)
|
||||
{
|
||||
pxa_device_fb.dev.parent = parent_dev;
|
||||
}
|
||||
|
||||
static struct resource pxa_resource_ffuart[] = {
|
||||
{
|
||||
.start = 0x40100000,
|
||||
|
|
|
@ -689,7 +689,7 @@ static struct pxafb_mach_info em_x270_lcd = {
|
|||
|
||||
static void __init em_x270_init_lcd(void)
|
||||
{
|
||||
set_pxa_fb_info(&em_x270_lcd);
|
||||
pxa_set_fb_info(NULL, &em_x270_lcd);
|
||||
}
|
||||
#else
|
||||
static inline void em_x270_init_lcd(void) {}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/mfd/t7l66xb.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
|
||||
#include <video/w100fb.h>
|
||||
|
||||
|
@ -51,12 +52,20 @@ void __init eseries_fixup(struct machine_desc *desc,
|
|||
mi->bank[0].size = (64*1024*1024);
|
||||
}
|
||||
|
||||
struct pxa2xx_udc_mach_info e7xx_udc_mach_info = {
|
||||
struct gpio_vbus_mach_info e7xx_udc_info = {
|
||||
.gpio_vbus = GPIO_E7XX_USB_DISC,
|
||||
.gpio_pullup = GPIO_E7XX_USB_PULLUP,
|
||||
.gpio_pullup_inverted = 1
|
||||
};
|
||||
|
||||
static struct platform_device e7xx_gpio_vbus = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e7xx_udc_info,
|
||||
},
|
||||
};
|
||||
|
||||
struct pxaficp_platform_data e7xx_ficp_platform_data = {
|
||||
.gpio_pwdown = GPIO_E7XX_IR_OFF,
|
||||
.transceiver_cap = IR_SIRMODE | IR_OFF,
|
||||
|
@ -165,6 +174,7 @@ static struct platform_device e330_tc6387xb_device = {
|
|||
|
||||
static struct platform_device *e330_devices[] __initdata = {
|
||||
&e330_tc6387xb_device,
|
||||
&e7xx_gpio_vbus,
|
||||
};
|
||||
|
||||
static void __init e330_init(void)
|
||||
|
@ -175,7 +185,6 @@ static void __init e330_init(void)
|
|||
eseries_register_clks();
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e330_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
}
|
||||
|
||||
MACHINE_START(E330, "Toshiba e330")
|
||||
|
@ -214,6 +223,7 @@ static struct platform_device e350_t7l66xb_device = {
|
|||
|
||||
static struct platform_device *e350_devices[] __initdata = {
|
||||
&e350_t7l66xb_device,
|
||||
&e7xx_gpio_vbus,
|
||||
};
|
||||
|
||||
static void __init e350_init(void)
|
||||
|
@ -224,7 +234,6 @@ static void __init e350_init(void)
|
|||
eseries_register_clks();
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e350_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
}
|
||||
|
||||
MACHINE_START(E350, "Toshiba e350")
|
||||
|
@ -333,6 +342,7 @@ static struct platform_device e400_t7l66xb_device = {
|
|||
|
||||
static struct platform_device *e400_devices[] __initdata = {
|
||||
&e400_t7l66xb_device,
|
||||
&e7xx_gpio_vbus,
|
||||
};
|
||||
|
||||
static void __init e400_init(void)
|
||||
|
@ -344,9 +354,8 @@ static void __init e400_init(void)
|
|||
/* Fixme - e400 may have a switched clock */
|
||||
eseries_register_clks();
|
||||
eseries_get_tmio_gpios();
|
||||
set_pxa_fb_info(&e400_pxafb_mach_info);
|
||||
pxa_set_fb_info(NULL, &e400_pxafb_mach_info);
|
||||
platform_add_devices(ARRAY_AND_SIZE(e400_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
}
|
||||
|
||||
MACHINE_START(E400, "Toshiba e400")
|
||||
|
@ -519,6 +528,7 @@ static struct platform_device e740_t7l66xb_device = {
|
|||
static struct platform_device *e740_devices[] __initdata = {
|
||||
&e740_fb_device,
|
||||
&e740_t7l66xb_device,
|
||||
&e7xx_gpio_vbus,
|
||||
};
|
||||
|
||||
static void __init e740_init(void)
|
||||
|
@ -532,7 +542,6 @@ static void __init e740_init(void)
|
|||
"UDCCLK", &pxa25x_device_udc.dev),
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e740_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ficp_info(&e7xx_ficp_platform_data);
|
||||
}
|
||||
|
@ -711,6 +720,7 @@ static struct platform_device e750_tc6393xb_device = {
|
|||
static struct platform_device *e750_devices[] __initdata = {
|
||||
&e750_fb_device,
|
||||
&e750_tc6393xb_device,
|
||||
&e7xx_gpio_vbus,
|
||||
};
|
||||
|
||||
static void __init e750_init(void)
|
||||
|
@ -723,7 +733,6 @@ static void __init e750_init(void)
|
|||
"GPIO11_CLK", NULL),
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e750_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ficp_info(&e7xx_ficp_platform_data);
|
||||
}
|
||||
|
@ -873,12 +882,21 @@ static struct platform_device e800_fb_device = {
|
|||
|
||||
/* --------------------------- UDC definitions --------------------------- */
|
||||
|
||||
static struct pxa2xx_udc_mach_info e800_udc_mach_info = {
|
||||
static struct gpio_vbus_mach_info e800_udc_info = {
|
||||
.gpio_vbus = GPIO_E800_USB_DISC,
|
||||
.gpio_pullup = GPIO_E800_USB_PULLUP,
|
||||
.gpio_pullup_inverted = 1
|
||||
};
|
||||
|
||||
static struct platform_device e800_gpio_vbus = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e800_udc_info,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
/* ----------------- e800 tc6393xb parameters ------------------ */
|
||||
|
||||
static struct tc6393xb_platform_data e800_tc6393xb_info = {
|
||||
|
@ -907,6 +925,7 @@ static struct platform_device e800_tc6393xb_device = {
|
|||
static struct platform_device *e800_devices[] __initdata = {
|
||||
&e800_fb_device,
|
||||
&e800_tc6393xb_device,
|
||||
&e800_gpio_vbus,
|
||||
};
|
||||
|
||||
static void __init e800_init(void)
|
||||
|
@ -919,7 +938,6 @@ static void __init e800_init(void)
|
|||
"GPIO11_CLK", NULL),
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e800_devices));
|
||||
pxa_set_udc_info(&e800_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -783,7 +783,7 @@ static void __init a780_init(void)
|
|||
|
||||
pxa_set_i2c_info(NULL);
|
||||
|
||||
set_pxa_fb_info(&ezx_fb_info_1);
|
||||
pxa_set_fb_info(NULL, &ezx_fb_info_1);
|
||||
|
||||
pxa_set_keypad_info(&a780_keypad_platform_data);
|
||||
|
||||
|
@ -853,7 +853,7 @@ static void __init e680_init(void)
|
|||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(e680_i2c_board_info));
|
||||
|
||||
set_pxa_fb_info(&ezx_fb_info_1);
|
||||
pxa_set_fb_info(NULL, &ezx_fb_info_1);
|
||||
|
||||
pxa_set_keypad_info(&e680_keypad_platform_data);
|
||||
|
||||
|
@ -918,7 +918,7 @@ static void __init a1200_init(void)
|
|||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(a1200_i2c_board_info));
|
||||
|
||||
set_pxa_fb_info(&ezx_fb_info_2);
|
||||
pxa_set_fb_info(NULL, &ezx_fb_info_2);
|
||||
|
||||
pxa_set_keypad_info(&a1200_keypad_platform_data);
|
||||
|
||||
|
@ -1103,7 +1103,7 @@ static void __init a910_init(void)
|
|||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(a910_i2c_board_info));
|
||||
|
||||
set_pxa_fb_info(&ezx_fb_info_2);
|
||||
pxa_set_fb_info(NULL, &ezx_fb_info_2);
|
||||
|
||||
pxa_set_keypad_info(&a910_keypad_platform_data);
|
||||
|
||||
|
@ -1173,7 +1173,7 @@ static void __init e6_init(void)
|
|||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(e6_i2c_board_info));
|
||||
|
||||
set_pxa_fb_info(&ezx_fb_info_2);
|
||||
pxa_set_fb_info(NULL, &ezx_fb_info_2);
|
||||
|
||||
pxa_set_keypad_info(&e6_keypad_platform_data);
|
||||
|
||||
|
@ -1212,7 +1212,7 @@ static void __init e2_init(void)
|
|||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(e2_i2c_board_info));
|
||||
|
||||
set_pxa_fb_info(&ezx_fb_info_2);
|
||||
pxa_set_fb_info(NULL, &ezx_fb_info_2);
|
||||
|
||||
pxa_set_keypad_info(&e2_keypad_platform_data);
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/memory.h>
|
||||
|
@ -106,14 +107,22 @@ static void __init gumstix_mmc_init(void)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_USB_GADGET_PXA25X
|
||||
static struct pxa2xx_udc_mach_info gumstix_udc_info __initdata = {
|
||||
static struct gpio_vbus_mach_info gumstix_udc_info = {
|
||||
.gpio_vbus = GPIO_GUMSTIX_USB_GPIOn,
|
||||
.gpio_pullup = GPIO_GUMSTIX_USB_GPIOx,
|
||||
};
|
||||
|
||||
static struct platform_device gumstix_gpio_vbus = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &gumstix_udc_info,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init gumstix_udc_init(void)
|
||||
{
|
||||
pxa_set_udc_info(&gumstix_udc_info);
|
||||
platform_device_register(&gumstix_gpio_vbus);
|
||||
}
|
||||
#else
|
||||
static void gumstix_udc_init(void)
|
||||
|
|
|
@ -167,7 +167,7 @@ static void __init idp_init(void)
|
|||
|
||||
platform_device_register(&smc91x_device);
|
||||
//platform_device_register(&mst_audio_device);
|
||||
set_pxa_fb_info(&sharp_lm8v31);
|
||||
pxa_set_fb_info(NULL, &sharp_lm8v31);
|
||||
pxa_set_mci_info(&idp_mci_platform_data);
|
||||
}
|
||||
|
||||
|
|
|
@ -44,6 +44,11 @@
|
|||
#define GPIO_NR_PALMZ72_BT_POWER 17
|
||||
#define GPIO_NR_PALMZ72_BT_RESET 83
|
||||
|
||||
/* Camera */
|
||||
#define GPIO_NR_PALMZ72_CAM_PWDN 56
|
||||
#define GPIO_NR_PALMZ72_CAM_RESET 57
|
||||
#define GPIO_NR_PALMZ72_CAM_POWER 91
|
||||
|
||||
/** Initial values **/
|
||||
|
||||
/* Battery */
|
||||
|
|
|
@ -154,8 +154,8 @@ struct pxafb_mach_info {
|
|||
void (*pxafb_lcd_power)(int, struct fb_var_screeninfo *);
|
||||
void (*smart_update)(struct fb_info *);
|
||||
};
|
||||
void set_pxa_fb_info(struct pxafb_mach_info *hard_pxa_fb_info);
|
||||
void set_pxa_fb_parent(struct device *parent_dev);
|
||||
|
||||
void pxa_set_fb_info(struct device *, struct pxafb_mach_info *);
|
||||
unsigned long pxafb_get_hsync_time(struct device *dev);
|
||||
|
||||
extern int pxafb_smart_queue(struct fb_info *info, uint16_t *cmds, int);
|
||||
|
|
|
@ -25,8 +25,7 @@
|
|||
#define GPIO98_ZIPITZ2_LID_BUTTON 98
|
||||
|
||||
/* Libertas GSPI8686 WiFi */
|
||||
#define GPIO14_ZIPITZ2_WIFI_RESET 14
|
||||
#define GPIO15_ZIPITZ2_WIFI_POWER 15
|
||||
#define GPIO14_ZIPITZ2_WIFI_POWER 14
|
||||
#define GPIO24_ZIPITZ2_WIFI_CS 24
|
||||
#define GPIO36_ZIPITZ2_WIFI_IRQ 36
|
||||
|
||||
|
|
|
@ -185,7 +185,7 @@ static struct pxafb_mach_info littleton_lcd_info = {
|
|||
|
||||
static void littleton_init_lcd(void)
|
||||
{
|
||||
set_pxa_fb_info(&littleton_lcd_info);
|
||||
pxa_set_fb_info(NULL, &littleton_lcd_info);
|
||||
}
|
||||
#else
|
||||
static inline void littleton_init_lcd(void) {};
|
||||
|
|
|
@ -480,7 +480,7 @@ static void __init lpd270_init(void)
|
|||
pxa_set_ac97_info(NULL);
|
||||
|
||||
if (lpd270_lcd_to_use != NULL)
|
||||
set_pxa_fb_info(lpd270_lcd_to_use);
|
||||
pxa_set_fb_info(NULL, lpd270_lcd_to_use);
|
||||
|
||||
pxa_set_ohci_info(&lpd270_ohci_platform_data);
|
||||
}
|
||||
|
|
|
@ -521,7 +521,7 @@ static void __init lubbock_init(void)
|
|||
|
||||
clk_add_alias("SA1111_CLK", NULL, "GPIO11_CLK", NULL);
|
||||
pxa_set_udc_info(&udc_info);
|
||||
set_pxa_fb_info(&sharp_lm8v31);
|
||||
pxa_set_fb_info(NULL, &sharp_lm8v31);
|
||||
pxa_set_mci_info(&lubbock_mci_platform_data);
|
||||
pxa_set_ficp_info(&lubbock_ficp_platform_data);
|
||||
pxa_set_ac97_info(NULL);
|
||||
|
|
|
@ -757,7 +757,7 @@ static void __init magician_init(void)
|
|||
gpio_direction_output(GPIO104_MAGICIAN_LCD_POWER_1, 0);
|
||||
gpio_direction_output(GPIO105_MAGICIAN_LCD_POWER_2, 0);
|
||||
gpio_direction_output(GPIO106_MAGICIAN_LCD_POWER_3, 0);
|
||||
set_pxa_fb_info(lcd_select ? &samsung_info : &toppoly_info);
|
||||
pxa_set_fb_info(NULL, lcd_select ? &samsung_info : &toppoly_info);
|
||||
} else
|
||||
pr_err("LCD detection: CPLD mapping failed\n");
|
||||
}
|
||||
|
|
|
@ -592,7 +592,7 @@ static void __init mainstone_init(void)
|
|||
else
|
||||
mainstone_pxafb_info.modes = &toshiba_ltm035a776c_mode;
|
||||
|
||||
set_pxa_fb_info(&mainstone_pxafb_info);
|
||||
pxa_set_fb_info(NULL, &mainstone_pxafb_info);
|
||||
mainstone_backlight_register();
|
||||
|
||||
pxa_set_mci_info(&mainstone_mci_platform_data);
|
||||
|
|
|
@ -795,7 +795,7 @@ static void __init mioa701_machine_init(void)
|
|||
pxa_set_stuart_info(NULL);
|
||||
mio_gpio_request(ARRAY_AND_SIZE(global_gpios));
|
||||
bootstrap_init();
|
||||
set_pxa_fb_info(&mioa701_pxafb_info);
|
||||
pxa_set_fb_info(NULL, &mioa701_pxafb_info);
|
||||
pxa_set_mci_info(&mioa701_mci_info);
|
||||
pxa_set_keypad_info(&mioa701_keypad_info);
|
||||
pxa_set_udc_info(&mioa701_udc_info);
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
/*
|
||||
* Common code for Palm LD, T5, TX, Z72
|
||||
*
|
||||
* Copyright (C) 2010
|
||||
* Marek Vasut <marek.vasut@gmail.com>
|
||||
* Copyright (C) 2010-2011 Marek Vasut <marek.vasut@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
|
@ -158,7 +157,7 @@ void __init palm27x_lcd_init(int power, struct pxafb_mode_info *mode)
|
|||
palm27x_lcd_screen.pxafb_lcd_power = palm27x_lcd_ctl;
|
||||
}
|
||||
|
||||
set_pxa_fb_info(&palm27x_lcd_screen);
|
||||
pxa_set_fb_info(NULL, &palm27x_lcd_screen);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -507,7 +507,7 @@ static struct pxafb_mach_info palmtc_lcd_screen = {
|
|||
|
||||
static void __init palmtc_lcd_init(void)
|
||||
{
|
||||
set_pxa_fb_info(&palmtc_lcd_screen);
|
||||
pxa_set_fb_info(NULL, &palmtc_lcd_screen);
|
||||
}
|
||||
#else
|
||||
static inline void palmtc_lcd_init(void) {}
|
||||
|
|
|
@ -136,30 +136,14 @@ static struct platform_device palmte2_pxa_keys = {
|
|||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
static struct gpio palmte_bl_gpios[] = {
|
||||
{ GPIO_NR_PALMTE2_BL_POWER, GPIOF_INIT_LOW, "Backlight power" },
|
||||
{ GPIO_NR_PALMTE2_LCD_POWER, GPIOF_INIT_LOW, "LCD power" },
|
||||
};
|
||||
|
||||
static int palmte2_backlight_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMTE2_BL_POWER, "BL POWER");
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMTE2_BL_POWER, 0);
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_request(GPIO_NR_PALMTE2_LCD_POWER, "LCD POWER");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMTE2_LCD_POWER, 0);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(GPIO_NR_PALMTE2_LCD_POWER);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMTE2_BL_POWER);
|
||||
err:
|
||||
return ret;
|
||||
return gpio_request_array(ARRAY_AND_SIZE(palmte_bl_gpios));
|
||||
}
|
||||
|
||||
static int palmte2_backlight_notify(struct device *dev, int brightness)
|
||||
|
@ -171,8 +155,7 @@ static int palmte2_backlight_notify(struct device *dev, int brightness)
|
|||
|
||||
static void palmte2_backlight_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMTE2_BL_POWER);
|
||||
gpio_free(GPIO_NR_PALMTE2_LCD_POWER);
|
||||
gpio_free_array(ARRAY_AND_SIZE(palmte_bl_gpios));
|
||||
}
|
||||
|
||||
static struct platform_pwm_backlight_data palmte2_backlight_data = {
|
||||
|
@ -363,7 +346,7 @@ static void __init palmte2_init(void)
|
|||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
set_pxa_fb_info(&palmte2_lcd_screen);
|
||||
pxa_set_fb_info(NULL, &palmte2_lcd_screen);
|
||||
pxa_set_mci_info(&palmte2_mci_platform_data);
|
||||
palmte2_udc_init();
|
||||
pxa_set_ac97_info(&palmte2_ac97_pdata);
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/wm97xx.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -47,6 +48,9 @@
|
|||
#include <mach/palm27x.h>
|
||||
|
||||
#include <mach/pm.h>
|
||||
#include <mach/camera.h>
|
||||
|
||||
#include <media/soc_camera.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
@ -103,6 +107,28 @@ static unsigned long palmz72_pin_config[] __initdata = {
|
|||
GPIO22_GPIO, /* LCD border color */
|
||||
GPIO96_GPIO, /* lcd power */
|
||||
|
||||
/* PXA Camera */
|
||||
GPIO81_CIF_DD_0,
|
||||
GPIO48_CIF_DD_5,
|
||||
GPIO50_CIF_DD_3,
|
||||
GPIO51_CIF_DD_2,
|
||||
GPIO52_CIF_DD_4,
|
||||
GPIO53_CIF_MCLK,
|
||||
GPIO54_CIF_PCLK,
|
||||
GPIO55_CIF_DD_1,
|
||||
GPIO84_CIF_FV,
|
||||
GPIO85_CIF_LV,
|
||||
GPIO93_CIF_DD_6,
|
||||
GPIO108_CIF_DD_7,
|
||||
|
||||
GPIO56_GPIO, /* OV9640 Powerdown */
|
||||
GPIO57_GPIO, /* OV9640 Reset */
|
||||
GPIO91_GPIO, /* OV9640 Power */
|
||||
|
||||
/* I2C */
|
||||
GPIO117_GPIO, /* I2C_SCL */
|
||||
GPIO118_GPIO, /* I2C_SDA */
|
||||
|
||||
/* Misc. */
|
||||
GPIO0_GPIO | WAKEUP_ON_LEVEL_HIGH, /* power detect */
|
||||
GPIO88_GPIO, /* green led */
|
||||
|
@ -253,6 +279,106 @@ static int __init palmz72_pm_init(void)
|
|||
device_initcall(palmz72_pm_init);
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* SoC Camera
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_SOC_CAMERA_OV9640) || \
|
||||
defined(CONFIG_SOC_CAMERA_OV9640_MODULE)
|
||||
static struct pxacamera_platform_data palmz72_pxacamera_platform_data = {
|
||||
.flags = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 |
|
||||
PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN,
|
||||
.mclk_10khz = 2600,
|
||||
};
|
||||
|
||||
/* Board I2C devices. */
|
||||
static struct i2c_board_info palmz72_i2c_device[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("ov9640", 0x30),
|
||||
}
|
||||
};
|
||||
|
||||
static int palmz72_camera_power(struct device *dev, int power)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_PALMZ72_CAM_PWDN, !power);
|
||||
mdelay(50);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int palmz72_camera_reset(struct device *dev)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_PALMZ72_CAM_RESET, 1);
|
||||
mdelay(50);
|
||||
gpio_set_value(GPIO_NR_PALMZ72_CAM_RESET, 0);
|
||||
mdelay(50);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct soc_camera_link palmz72_iclink = {
|
||||
.bus_id = 0, /* Match id in pxa27x_device_camera in device.c */
|
||||
.board_info = &palmz72_i2c_device[0],
|
||||
.i2c_adapter_id = 0,
|
||||
.module_name = "ov96xx",
|
||||
.power = &palmz72_camera_power,
|
||||
.reset = &palmz72_camera_reset,
|
||||
.flags = SOCAM_DATAWIDTH_8,
|
||||
};
|
||||
|
||||
static struct i2c_gpio_platform_data palmz72_i2c_bus_data = {
|
||||
.sda_pin = 118,
|
||||
.scl_pin = 117,
|
||||
.udelay = 10,
|
||||
.timeout = 100,
|
||||
};
|
||||
|
||||
static struct platform_device palmz72_i2c_bus_device = {
|
||||
.name = "i2c-gpio",
|
||||
.id = 0, /* we use this as a replacement for i2c-pxa */
|
||||
.dev = {
|
||||
.platform_data = &palmz72_i2c_bus_data,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device palmz72_camera = {
|
||||
.name = "soc-camera-pdrv",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palmz72_iclink,
|
||||
},
|
||||
};
|
||||
|
||||
/* Here we request the camera GPIOs and configure them. We power up the camera
|
||||
* module, deassert the reset pin, but put it into powerdown (low to no power
|
||||
* consumption) mode. This allows us to later bring the module up fast. */
|
||||
static struct gpio palmz72_camera_gpios[] = {
|
||||
{ GPIO_NR_PALMZ72_CAM_POWER, GPIOF_INIT_HIGH,"Camera DVDD" },
|
||||
{ GPIO_NR_PALMZ72_CAM_RESET, GPIOF_INIT_LOW, "Camera RESET" },
|
||||
{ GPIO_NR_PALMZ72_CAM_PWDN, GPIOF_INIT_LOW, "Camera PWDN" },
|
||||
};
|
||||
|
||||
static inline void __init palmz72_cam_gpio_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request_array(ARRAY_AND_SIZE(palmz72_camera_gpios));
|
||||
if (!ret)
|
||||
gpio_free_array(ARRAY_AND_SIZE(palmz72_camera_gpios));
|
||||
else
|
||||
printk(KERN_ERR "Camera GPIO init failed!\n");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static void __init palmz72_camera_init(void)
|
||||
{
|
||||
palmz72_cam_gpio_init();
|
||||
pxa_set_camera_info(&palmz72_pxacamera_platform_data);
|
||||
platform_device_register(&palmz72_i2c_bus_device);
|
||||
platform_device_register(&palmz72_camera);
|
||||
}
|
||||
#else
|
||||
static inline void palmz72_camera_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
|
@ -276,6 +402,7 @@ static void __init palmz72_init(void)
|
|||
palm27x_pmic_init();
|
||||
palmz72_kpc_init();
|
||||
palmz72_leds_init();
|
||||
palmz72_camera_init();
|
||||
}
|
||||
|
||||
MACHINE_START(PALMZ72, "Palm Zire72")
|
||||
|
|
|
@ -515,7 +515,7 @@ void __init pcm990_baseboard_init(void)
|
|||
pcm990_init_irq();
|
||||
|
||||
#ifndef CONFIG_PCM990_DISPLAY_NONE
|
||||
set_pxa_fb_info(&pcm990_fbinfo);
|
||||
pxa_set_fb_info(NULL, &pcm990_fbinfo);
|
||||
#endif
|
||||
platform_device_register(&pcm990_backlight_device);
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user