Merge branch 'tip/perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace into perf/core
This commit is contained in:
commit
636f0c70f2
|
@ -1100,6 +1100,15 @@ emulate them efficiently. The fields in each entry are defined as follows:
|
|||
eax, ebx, ecx, edx: the values returned by the cpuid instruction for
|
||||
this function/index combination
|
||||
|
||||
The TSC deadline timer feature (CPUID leaf 1, ecx[24]) is always returned
|
||||
as false, since the feature depends on KVM_CREATE_IRQCHIP for local APIC
|
||||
support. Instead it is reported via
|
||||
|
||||
ioctl(KVM_CHECK_EXTENSION, KVM_CAP_TSC_DEADLINE_TIMER)
|
||||
|
||||
if that returns true and you use KVM_CREATE_IRQCHIP, or if you emulate the
|
||||
feature in userspace, then you can enable the feature for KVM_SET_CPUID2.
|
||||
|
||||
4.47 KVM_PPC_GET_PVINFO
|
||||
|
||||
Capability: KVM_CAP_PPC_GET_PVINFO
|
||||
|
@ -1151,6 +1160,13 @@ following flags are specified:
|
|||
/* Depends on KVM_CAP_IOMMU */
|
||||
#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)
|
||||
|
||||
The KVM_DEV_ASSIGN_ENABLE_IOMMU flag is a mandatory option to ensure
|
||||
isolation of the device. Usages not specifying this flag are deprecated.
|
||||
|
||||
Only PCI header type 0 devices with PCI BAR resources are supported by
|
||||
device assignment. The user requesting this ioctl must have read/write
|
||||
access to the PCI sysfs resource files associated with the device.
|
||||
|
||||
4.49 KVM_DEASSIGN_PCI_DEVICE
|
||||
|
||||
Capability: KVM_CAP_DEVICE_DEASSIGNMENT
|
||||
|
|
28
MAINTAINERS
28
MAINTAINERS
|
@ -1698,11 +1698,9 @@ F: arch/x86/include/asm/tce.h
|
|||
|
||||
CAN NETWORK LAYER
|
||||
M: Oliver Hartkopp <socketcan@hartkopp.net>
|
||||
M: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
|
||||
M: Urs Thuermann <urs.thuermann@volkswagen.de>
|
||||
L: linux-can@vger.kernel.org
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://developer.berlios.de/projects/socketcan/
|
||||
W: http://gitorious.org/linux-can
|
||||
T: git git://gitorious.org/linux-can/linux-can-next.git
|
||||
S: Maintained
|
||||
F: net/can/
|
||||
F: include/linux/can.h
|
||||
|
@ -1713,9 +1711,10 @@ F: include/linux/can/gw.h
|
|||
|
||||
CAN NETWORK DRIVERS
|
||||
M: Wolfgang Grandegger <wg@grandegger.com>
|
||||
M: Marc Kleine-Budde <mkl@pengutronix.de>
|
||||
L: linux-can@vger.kernel.org
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://developer.berlios.de/projects/socketcan/
|
||||
W: http://gitorious.org/linux-can
|
||||
T: git git://gitorious.org/linux-can/linux-can-next.git
|
||||
S: Maintained
|
||||
F: drivers/net/can/
|
||||
F: include/linux/can/dev.h
|
||||
|
@ -2700,7 +2699,7 @@ FIREWIRE SUBSYSTEM
|
|||
M: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
||||
L: linux1394-devel@lists.sourceforge.net
|
||||
W: http://ieee1394.wiki.kernel.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394.git
|
||||
S: Maintained
|
||||
F: drivers/firewire/
|
||||
F: include/linux/firewire*.h
|
||||
|
@ -3101,6 +3100,7 @@ F: include/linux/hid*
|
|||
|
||||
HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
||||
S: Maintained
|
||||
F: Documentation/timers/
|
||||
F: kernel/hrtimer.c
|
||||
|
@ -3610,7 +3610,7 @@ F: net/irda/
|
|||
IRQ SUBSYSTEM
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
||||
F: kernel/irq/
|
||||
|
||||
ISAPNP
|
||||
|
@ -4098,7 +4098,7 @@ F: drivers/hwmon/lm90.c
|
|||
LOCKDEP AND LOCKSTAT
|
||||
M: Peter Zijlstra <peterz@infradead.org>
|
||||
M: Ingo Molnar <mingo@redhat.com>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking
|
||||
S: Maintained
|
||||
F: Documentation/lockdep*.txt
|
||||
F: Documentation/lockstat.txt
|
||||
|
@ -4280,7 +4280,9 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
|||
S: Maintained
|
||||
F: Documentation/dvb/
|
||||
F: Documentation/video4linux/
|
||||
F: Documentation/DocBook/media/
|
||||
F: drivers/media/
|
||||
F: drivers/staging/media/
|
||||
F: include/media/
|
||||
F: include/linux/dvb/
|
||||
F: include/linux/videodev*.h
|
||||
|
@ -5086,6 +5088,7 @@ M: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
|||
M: Paul Mackerras <paulus@samba.org>
|
||||
M: Ingo Molnar <mingo@elte.hu>
|
||||
M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
|
||||
S: Supported
|
||||
F: kernel/events/*
|
||||
F: include/linux/perf_event.h
|
||||
|
@ -5165,6 +5168,7 @@ F: drivers/scsi/pm8001/
|
|||
|
||||
POSIX CLOCKS and TIMERS
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
||||
S: Supported
|
||||
F: fs/timerfd.c
|
||||
F: include/linux/timer*
|
||||
|
@ -5680,6 +5684,7 @@ F: drivers/dma/dw_dmac.c
|
|||
TIMEKEEPING, NTP
|
||||
M: John Stultz <johnstul@us.ibm.com>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
||||
S: Supported
|
||||
F: include/linux/clocksource.h
|
||||
F: include/linux/time.h
|
||||
|
@ -5704,6 +5709,7 @@ F: drivers/watchdog/sc1200wdt.c
|
|||
SCHEDULER
|
||||
M: Ingo Molnar <mingo@elte.hu>
|
||||
M: Peter Zijlstra <peterz@infradead.org>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
|
||||
S: Maintained
|
||||
F: kernel/sched*
|
||||
F: include/linux/sched.h
|
||||
|
@ -6631,7 +6637,7 @@ TRACING
|
|||
M: Steven Rostedt <rostedt@goodmis.org>
|
||||
M: Frederic Weisbecker <fweisbec@gmail.com>
|
||||
M: Ingo Molnar <mingo@redhat.com>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf/core
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
|
||||
S: Maintained
|
||||
F: Documentation/trace/ftrace.txt
|
||||
F: arch/*/*/*/ftrace.h
|
||||
|
@ -7381,7 +7387,7 @@ M: Thomas Gleixner <tglx@linutronix.de>
|
|||
M: Ingo Molnar <mingo@redhat.com>
|
||||
M: "H. Peter Anvin" <hpa@zytor.com>
|
||||
M: x86@kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
|
||||
S: Maintained
|
||||
F: Documentation/x86/
|
||||
F: arch/x86/
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 2
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION =
|
||||
NAME = Saber-toothed Squirrel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -1246,7 +1246,7 @@ config PL310_ERRATA_588369
|
|||
|
||||
config ARM_ERRATA_720789
|
||||
bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID"
|
||||
depends on CPU_V7 && SMP
|
||||
depends on CPU_V7
|
||||
help
|
||||
This option enables the workaround for the 720789 Cortex-A9 (prior to
|
||||
r2p0) erratum. A faulty ASID can be sent to the other CPUs for the
|
||||
|
@ -1282,7 +1282,7 @@ config ARM_ERRATA_743622
|
|||
|
||||
config ARM_ERRATA_751472
|
||||
bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation"
|
||||
depends on CPU_V7 && SMP
|
||||
depends on CPU_V7
|
||||
help
|
||||
This option enables the workaround for the 751472 Cortex-A9 (prior
|
||||
to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the
|
||||
|
|
|
@ -221,17 +221,6 @@
|
|||
*/
|
||||
#define MCODE_BUFF_PER_REQ 256
|
||||
|
||||
/*
|
||||
* Mark a _pl330_req as free.
|
||||
* We do it by writing DMAEND as the first instruction
|
||||
* because no valid request is going to have DMAEND as
|
||||
* its first instruction to execute.
|
||||
*/
|
||||
#define MARK_FREE(req) do { \
|
||||
_emit_END(0, (req)->mc_cpu); \
|
||||
(req)->mc_len = 0; \
|
||||
} while (0)
|
||||
|
||||
/* If the _pl330_req is available to the client */
|
||||
#define IS_FREE(req) (*((u8 *)((req)->mc_cpu)) == CMD_DMAEND)
|
||||
|
||||
|
@ -301,8 +290,10 @@ struct pl330_thread {
|
|||
struct pl330_dmac *dmac;
|
||||
/* Only two at a time */
|
||||
struct _pl330_req req[2];
|
||||
/* Index of the last submitted request */
|
||||
/* Index of the last enqueued request */
|
||||
unsigned lstenq;
|
||||
/* Index of the last submitted request or -1 if the DMA is stopped */
|
||||
int req_running;
|
||||
};
|
||||
|
||||
enum pl330_dmac_state {
|
||||
|
@ -778,6 +769,22 @@ static inline void _execute_DBGINSN(struct pl330_thread *thrd,
|
|||
writel(0, regs + DBGCMD);
|
||||
}
|
||||
|
||||
/*
|
||||
* Mark a _pl330_req as free.
|
||||
* We do it by writing DMAEND as the first instruction
|
||||
* because no valid request is going to have DMAEND as
|
||||
* its first instruction to execute.
|
||||
*/
|
||||
static void mark_free(struct pl330_thread *thrd, int idx)
|
||||
{
|
||||
struct _pl330_req *req = &thrd->req[idx];
|
||||
|
||||
_emit_END(0, req->mc_cpu);
|
||||
req->mc_len = 0;
|
||||
|
||||
thrd->req_running = -1;
|
||||
}
|
||||
|
||||
static inline u32 _state(struct pl330_thread *thrd)
|
||||
{
|
||||
void __iomem *regs = thrd->dmac->pinfo->base;
|
||||
|
@ -836,31 +843,6 @@ static inline u32 _state(struct pl330_thread *thrd)
|
|||
}
|
||||
}
|
||||
|
||||
/* If the request 'req' of thread 'thrd' is currently active */
|
||||
static inline bool _req_active(struct pl330_thread *thrd,
|
||||
struct _pl330_req *req)
|
||||
{
|
||||
void __iomem *regs = thrd->dmac->pinfo->base;
|
||||
u32 buf = req->mc_bus, pc = readl(regs + CPC(thrd->id));
|
||||
|
||||
if (IS_FREE(req))
|
||||
return false;
|
||||
|
||||
return (pc >= buf && pc <= buf + req->mc_len) ? true : false;
|
||||
}
|
||||
|
||||
/* Returns 0 if the thread is inactive, ID of active req + 1 otherwise */
|
||||
static inline unsigned _thrd_active(struct pl330_thread *thrd)
|
||||
{
|
||||
if (_req_active(thrd, &thrd->req[0]))
|
||||
return 1; /* First req active */
|
||||
|
||||
if (_req_active(thrd, &thrd->req[1]))
|
||||
return 2; /* Second req active */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void _stop(struct pl330_thread *thrd)
|
||||
{
|
||||
void __iomem *regs = thrd->dmac->pinfo->base;
|
||||
|
@ -892,17 +874,22 @@ static bool _trigger(struct pl330_thread *thrd)
|
|||
struct _arg_GO go;
|
||||
unsigned ns;
|
||||
u8 insn[6] = {0, 0, 0, 0, 0, 0};
|
||||
int idx;
|
||||
|
||||
/* Return if already ACTIVE */
|
||||
if (_state(thrd) != PL330_STATE_STOPPED)
|
||||
return true;
|
||||
|
||||
if (!IS_FREE(&thrd->req[1 - thrd->lstenq]))
|
||||
req = &thrd->req[1 - thrd->lstenq];
|
||||
else if (!IS_FREE(&thrd->req[thrd->lstenq]))
|
||||
req = &thrd->req[thrd->lstenq];
|
||||
else
|
||||
req = NULL;
|
||||
idx = 1 - thrd->lstenq;
|
||||
if (!IS_FREE(&thrd->req[idx]))
|
||||
req = &thrd->req[idx];
|
||||
else {
|
||||
idx = thrd->lstenq;
|
||||
if (!IS_FREE(&thrd->req[idx]))
|
||||
req = &thrd->req[idx];
|
||||
else
|
||||
req = NULL;
|
||||
}
|
||||
|
||||
/* Return if no request */
|
||||
if (!req || !req->r)
|
||||
|
@ -933,6 +920,8 @@ static bool _trigger(struct pl330_thread *thrd)
|
|||
/* Only manager can execute GO */
|
||||
_execute_DBGINSN(thrd, insn, true);
|
||||
|
||||
thrd->req_running = idx;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1382,8 +1371,8 @@ static void pl330_dotask(unsigned long data)
|
|||
|
||||
thrd->req[0].r = NULL;
|
||||
thrd->req[1].r = NULL;
|
||||
MARK_FREE(&thrd->req[0]);
|
||||
MARK_FREE(&thrd->req[1]);
|
||||
mark_free(thrd, 0);
|
||||
mark_free(thrd, 1);
|
||||
|
||||
/* Clear the reset flag */
|
||||
pl330->dmac_tbd.reset_chan &= ~(1 << i);
|
||||
|
@ -1461,14 +1450,12 @@ int pl330_update(const struct pl330_info *pi)
|
|||
|
||||
thrd = &pl330->channels[id];
|
||||
|
||||
active = _thrd_active(thrd);
|
||||
if (!active) /* Aborted */
|
||||
active = thrd->req_running;
|
||||
if (active == -1) /* Aborted */
|
||||
continue;
|
||||
|
||||
active -= 1;
|
||||
|
||||
rqdone = &thrd->req[active];
|
||||
MARK_FREE(rqdone);
|
||||
mark_free(thrd, active);
|
||||
|
||||
/* Get going again ASAP */
|
||||
_start(thrd);
|
||||
|
@ -1509,7 +1496,7 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)
|
|||
struct pl330_thread *thrd = ch_id;
|
||||
struct pl330_dmac *pl330;
|
||||
unsigned long flags;
|
||||
int ret = 0, active;
|
||||
int ret = 0, active = thrd->req_running;
|
||||
|
||||
if (!thrd || thrd->free || thrd->dmac->state == DYING)
|
||||
return -EINVAL;
|
||||
|
@ -1525,28 +1512,24 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)
|
|||
|
||||
thrd->req[0].r = NULL;
|
||||
thrd->req[1].r = NULL;
|
||||
MARK_FREE(&thrd->req[0]);
|
||||
MARK_FREE(&thrd->req[1]);
|
||||
mark_free(thrd, 0);
|
||||
mark_free(thrd, 1);
|
||||
break;
|
||||
|
||||
case PL330_OP_ABORT:
|
||||
active = _thrd_active(thrd);
|
||||
|
||||
/* Make sure the channel is stopped */
|
||||
_stop(thrd);
|
||||
|
||||
/* ABORT is only for the active req */
|
||||
if (!active)
|
||||
if (active == -1)
|
||||
break;
|
||||
|
||||
active--;
|
||||
|
||||
thrd->req[active].r = NULL;
|
||||
MARK_FREE(&thrd->req[active]);
|
||||
mark_free(thrd, active);
|
||||
|
||||
/* Start the next */
|
||||
case PL330_OP_START:
|
||||
if (!_thrd_active(thrd) && !_start(thrd))
|
||||
if ((active == -1) && !_start(thrd))
|
||||
ret = -EIO;
|
||||
break;
|
||||
|
||||
|
@ -1587,14 +1570,13 @@ int pl330_chan_status(void *ch_id, struct pl330_chanstatus *pstatus)
|
|||
else
|
||||
pstatus->faulting = false;
|
||||
|
||||
active = _thrd_active(thrd);
|
||||
active = thrd->req_running;
|
||||
|
||||
if (!active) {
|
||||
if (active == -1) {
|
||||
/* Indicate that the thread is not running */
|
||||
pstatus->top_req = NULL;
|
||||
pstatus->wait_req = NULL;
|
||||
} else {
|
||||
active--;
|
||||
pstatus->top_req = thrd->req[active].r;
|
||||
pstatus->wait_req = !IS_FREE(&thrd->req[1 - active])
|
||||
? thrd->req[1 - active].r : NULL;
|
||||
|
@ -1659,9 +1641,9 @@ void *pl330_request_channel(const struct pl330_info *pi)
|
|||
thrd->free = false;
|
||||
thrd->lstenq = 1;
|
||||
thrd->req[0].r = NULL;
|
||||
MARK_FREE(&thrd->req[0]);
|
||||
mark_free(thrd, 0);
|
||||
thrd->req[1].r = NULL;
|
||||
MARK_FREE(&thrd->req[1]);
|
||||
mark_free(thrd, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1767,14 +1749,14 @@ static inline void _reset_thread(struct pl330_thread *thrd)
|
|||
thrd->req[0].mc_bus = pl330->mcode_bus
|
||||
+ (thrd->id * pi->mcbufsz);
|
||||
thrd->req[0].r = NULL;
|
||||
MARK_FREE(&thrd->req[0]);
|
||||
mark_free(thrd, 0);
|
||||
|
||||
thrd->req[1].mc_cpu = thrd->req[0].mc_cpu
|
||||
+ pi->mcbufsz / 2;
|
||||
thrd->req[1].mc_bus = thrd->req[0].mc_bus
|
||||
+ pi->mcbufsz / 2;
|
||||
thrd->req[1].r = NULL;
|
||||
MARK_FREE(&thrd->req[1]);
|
||||
mark_free(thrd, 1);
|
||||
}
|
||||
|
||||
static int dmac_alloc_threads(struct pl330_dmac *pl330)
|
||||
|
|
|
@ -18,9 +18,10 @@ CONFIG_ARCH_MXC=y
|
|||
CONFIG_ARCH_IMX_V4_V5=y
|
||||
CONFIG_ARCH_MX1ADS=y
|
||||
CONFIG_MACH_SCB9328=y
|
||||
CONFIG_MACH_APF9328=y
|
||||
CONFIG_MACH_MX21ADS=y
|
||||
CONFIG_MACH_MX25_3DS=y
|
||||
CONFIG_MACH_EUKREA_CPUIMX25=y
|
||||
CONFIG_MACH_EUKREA_CPUIMX25SD=y
|
||||
CONFIG_MACH_MX27ADS=y
|
||||
CONFIG_MACH_PCM038=y
|
||||
CONFIG_MACH_CPUIMX27=y
|
||||
|
@ -72,17 +73,16 @@ CONFIG_MTD_CFI_GEOMETRY=y
|
|||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_MXC=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MISC_DEVICES=y
|
||||
CONFIG_EEPROM_AT24=y
|
||||
CONFIG_EEPROM_AT25=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_SMC91X=y
|
||||
CONFIG_DM9000=y
|
||||
CONFIG_SMC91X=y
|
||||
CONFIG_SMC911X=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
CONFIG_SMSC_PHY=y
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
|
@ -100,6 +100,7 @@ CONFIG_I2C_CHARDEV=y
|
|||
CONFIG_I2C_IMX=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_IMX=y
|
||||
CONFIG_SPI_SPIDEV=y
|
||||
CONFIG_W1=y
|
||||
CONFIG_W1_MASTER_MXC=y
|
||||
CONFIG_W1_SLAVE_THERM=y
|
||||
|
@ -139,6 +140,7 @@ CONFIG_MMC=y
|
|||
CONFIG_MMC_MXC=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_MC13783=y
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
|
|
|
@ -110,11 +110,6 @@ static struct map_desc exynos4_iodesc[] __initdata = {
|
|||
.pfn = __phys_to_pfn(EXYNOS4_PA_DMC0),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S5P_VA_SROMC,
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_SROMC),
|
||||
.length = SZ_4K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = (unsigned long)S3C_VA_USB_HSPHY,
|
||||
.pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY),
|
||||
|
|
|
@ -132,7 +132,7 @@ config MACH_MX25_3DS
|
|||
select IMX_HAVE_PLATFORM_MXC_NAND
|
||||
select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
|
||||
|
||||
config MACH_EUKREA_CPUIMX25
|
||||
config MACH_EUKREA_CPUIMX25SD
|
||||
bool "Support Eukrea CPUIMX25 Platform"
|
||||
select SOC_IMX25
|
||||
select IMX_HAVE_PLATFORM_FLEXCAN
|
||||
|
@ -148,7 +148,7 @@ config MACH_EUKREA_CPUIMX25
|
|||
|
||||
choice
|
||||
prompt "Baseboard"
|
||||
depends on MACH_EUKREA_CPUIMX25
|
||||
depends on MACH_EUKREA_CPUIMX25SD
|
||||
default MACH_EUKREA_MBIMXSD25_BASEBOARD
|
||||
|
||||
config MACH_EUKREA_MBIMXSD25_BASEBOARD
|
||||
|
@ -542,7 +542,7 @@ config MACH_MX35_3DS
|
|||
Include support for MX35PDK platform. This includes specific
|
||||
configurations for the board and its peripherals.
|
||||
|
||||
config MACH_EUKREA_CPUIMX35
|
||||
config MACH_EUKREA_CPUIMX35SD
|
||||
bool "Support Eukrea CPUIMX35 Platform"
|
||||
select SOC_IMX35
|
||||
select IMX_HAVE_PLATFORM_FLEXCAN
|
||||
|
@ -560,7 +560,7 @@ config MACH_EUKREA_CPUIMX35
|
|||
|
||||
choice
|
||||
prompt "Baseboard"
|
||||
depends on MACH_EUKREA_CPUIMX35
|
||||
depends on MACH_EUKREA_CPUIMX35SD
|
||||
default MACH_EUKREA_MBIMXSD35_BASEBOARD
|
||||
|
||||
config MACH_EUKREA_MBIMXSD35_BASEBOARD
|
||||
|
|
|
@ -24,7 +24,7 @@ obj-$(CONFIG_MACH_MX21ADS) += mach-mx21ads.o
|
|||
|
||||
# i.MX25 based machines
|
||||
obj-$(CONFIG_MACH_MX25_3DS) += mach-mx25_3ds.o
|
||||
obj-$(CONFIG_MACH_EUKREA_CPUIMX25) += mach-eukrea_cpuimx25.o
|
||||
obj-$(CONFIG_MACH_EUKREA_CPUIMX25SD) += mach-eukrea_cpuimx25.o
|
||||
obj-$(CONFIG_MACH_EUKREA_MBIMXSD25_BASEBOARD) += eukrea_mbimxsd25-baseboard.o
|
||||
|
||||
# i.MX27 based machines
|
||||
|
@ -57,7 +57,7 @@ obj-$(CONFIG_MACH_BUG) += mach-bug.o
|
|||
# i.MX35 based machines
|
||||
obj-$(CONFIG_MACH_PCM043) += mach-pcm043.o
|
||||
obj-$(CONFIG_MACH_MX35_3DS) += mach-mx35_3ds.o
|
||||
obj-$(CONFIG_MACH_EUKREA_CPUIMX35) += mach-cpuimx35.o
|
||||
obj-$(CONFIG_MACH_EUKREA_CPUIMX35SD) += mach-cpuimx35.o
|
||||
obj-$(CONFIG_MACH_EUKREA_MBIMXSD35_BASEBOARD) += eukrea_mbimxsd35-baseboard.o
|
||||
obj-$(CONFIG_MACH_VPR200) += mach-vpr200.o
|
||||
|
||||
|
|
|
@ -507,7 +507,7 @@ static struct clk_lookup lookups[] = {
|
|||
|
||||
int __init mx35_clocks_init()
|
||||
{
|
||||
unsigned int cgr2 = 3 << 26, cgr3 = 0;
|
||||
unsigned int cgr2 = 3 << 26;
|
||||
|
||||
#if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_ICEDCC)
|
||||
cgr2 |= 3 << 16;
|
||||
|
@ -521,6 +521,12 @@ int __init mx35_clocks_init()
|
|||
__raw_writel((3 << 18), CCM_BASE + CCM_CGR0);
|
||||
__raw_writel((3 << 2) | (3 << 4) | (3 << 6) | (3 << 8) | (3 << 16),
|
||||
CCM_BASE + CCM_CGR1);
|
||||
__raw_writel(cgr2, CCM_BASE + CCM_CGR2);
|
||||
__raw_writel(0, CCM_BASE + CCM_CGR3);
|
||||
|
||||
clk_enable(&iim_clk);
|
||||
imx_print_silicon_rev("i.MX35", mx35_revision());
|
||||
clk_disable(&iim_clk);
|
||||
|
||||
/*
|
||||
* Check if we came up in internal boot mode. If yes, we need some
|
||||
|
@ -529,17 +535,11 @@ int __init mx35_clocks_init()
|
|||
*/
|
||||
if (!(__raw_readl(CCM_BASE + CCM_RCSR) & (3 << 10))) {
|
||||
/* Additionally turn on UART1, SCC, and IIM clocks */
|
||||
cgr2 |= 3 << 16 | 3 << 4;
|
||||
cgr3 |= 3 << 2;
|
||||
clk_enable(&iim_clk);
|
||||
clk_enable(&uart1_clk);
|
||||
clk_enable(&scc_clk);
|
||||
}
|
||||
|
||||
__raw_writel(cgr2, CCM_BASE + CCM_CGR2);
|
||||
__raw_writel(cgr3, CCM_BASE + CCM_CGR3);
|
||||
|
||||
clk_enable(&iim_clk);
|
||||
imx_print_silicon_rev("i.MX35", mx35_revision());
|
||||
clk_disable(&iim_clk);
|
||||
|
||||
#ifdef CONFIG_MXC_USE_EPIT
|
||||
epit_timer_init(&epit1_clk,
|
||||
MX35_IO_ADDRESS(MX35_EPIT1_BASE_ADDR), MX35_INT_EPIT1);
|
||||
|
|
|
@ -53,12 +53,18 @@ static const struct imxi2c_platform_data
|
|||
.bitrate = 100000,
|
||||
};
|
||||
|
||||
#define TSC2007_IRQGPIO IMX_GPIO_NR(3, 2)
|
||||
static int tsc2007_get_pendown_state(void)
|
||||
{
|
||||
return !gpio_get_value(TSC2007_IRQGPIO);
|
||||
}
|
||||
|
||||
static struct tsc2007_platform_data tsc2007_info = {
|
||||
.model = 2007,
|
||||
.x_plate_ohms = 180,
|
||||
.get_pendown_state = tsc2007_get_pendown_state,
|
||||
};
|
||||
|
||||
#define TSC2007_IRQGPIO IMX_GPIO_NR(3, 2)
|
||||
static struct i2c_board_info eukrea_cpuimx35_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("pcf8563", 0x51),
|
||||
|
|
|
@ -3247,18 +3247,14 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
|
|||
|
||||
/* 3430ES1-only hwmods */
|
||||
static __initdata struct omap_hwmod *omap3430es1_hwmods[] = {
|
||||
&omap3xxx_iva_hwmod,
|
||||
&omap3430es1_dss_core_hwmod,
|
||||
&omap3xxx_mailbox_hwmod,
|
||||
NULL
|
||||
};
|
||||
|
||||
/* 3430ES2+-only hwmods */
|
||||
static __initdata struct omap_hwmod *omap3430es2plus_hwmods[] = {
|
||||
&omap3xxx_iva_hwmod,
|
||||
&omap3xxx_dss_core_hwmod,
|
||||
&omap3xxx_usbhsotg_hwmod,
|
||||
&omap3xxx_mailbox_hwmod,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
@ -607,6 +607,7 @@ struct sys_timer ag5evm_timer = {
|
|||
|
||||
MACHINE_START(AG5EVM, "ag5evm")
|
||||
.map_io = ag5evm_map_io,
|
||||
.nr_irqs = NR_IRQS_LEGACY,
|
||||
.init_irq = sh73a0_init_irq,
|
||||
.handle_irq = shmobile_handle_irq_gic,
|
||||
.init_machine = ag5evm_init,
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <linux/input/sh_keysc.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/platform_data/leds-renesas-tpu.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/sh_mmcif.h>
|
||||
#include <linux/mfd/tmio.h>
|
||||
|
@ -56,7 +57,7 @@ static struct resource smsc9220_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = gic_spi(33), /* PINTA2 @ PORT144 */
|
||||
.start = SH73A0_PINT0_IRQ(2), /* PINTA2 */
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -157,10 +158,6 @@ static struct platform_device gpio_keys_device = {
|
|||
#define GPIO_LED(n, g) { .name = n, .gpio = g }
|
||||
|
||||
static struct gpio_led gpio_leds[] = {
|
||||
GPIO_LED("V2513", GPIO_PORT153), /* PORT153 [TPU1T02] -> V2513 */
|
||||
GPIO_LED("V2514", GPIO_PORT199), /* PORT199 [TPU4TO1] -> V2514 */
|
||||
GPIO_LED("V2515", GPIO_PORT197), /* PORT197 [TPU2TO1] -> V2515 */
|
||||
GPIO_LED("KEYLED", GPIO_PORT163), /* PORT163 [TPU3TO0] -> KEYLED */
|
||||
GPIO_LED("G", GPIO_PORT20), /* PORT20 [GPO0] -> LED7 -> "G" */
|
||||
GPIO_LED("H", GPIO_PORT21), /* PORT21 [GPO1] -> LED8 -> "H" */
|
||||
GPIO_LED("J", GPIO_PORT22), /* PORT22 [GPO2] -> LED9 -> "J" */
|
||||
|
@ -179,6 +176,119 @@ static struct platform_device gpio_leds_device = {
|
|||
},
|
||||
};
|
||||
|
||||
/* TPU LED */
|
||||
static struct led_renesas_tpu_config led_renesas_tpu12_pdata = {
|
||||
.name = "V2513",
|
||||
.pin_gpio_fn = GPIO_FN_TPU1TO2,
|
||||
.pin_gpio = GPIO_PORT153,
|
||||
.channel_offset = 0x90,
|
||||
.timer_bit = 2,
|
||||
.max_brightness = 1000,
|
||||
};
|
||||
|
||||
static struct resource tpu12_resources[] = {
|
||||
[0] = {
|
||||
.name = "TPU12",
|
||||
.start = 0xe6610090,
|
||||
.end = 0xe66100b5,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device leds_tpu12_device = {
|
||||
.name = "leds-renesas-tpu",
|
||||
.id = 12,
|
||||
.dev = {
|
||||
.platform_data = &led_renesas_tpu12_pdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(tpu12_resources),
|
||||
.resource = tpu12_resources,
|
||||
};
|
||||
|
||||
static struct led_renesas_tpu_config led_renesas_tpu41_pdata = {
|
||||
.name = "V2514",
|
||||
.pin_gpio_fn = GPIO_FN_TPU4TO1,
|
||||
.pin_gpio = GPIO_PORT199,
|
||||
.channel_offset = 0x50,
|
||||
.timer_bit = 1,
|
||||
.max_brightness = 1000,
|
||||
};
|
||||
|
||||
static struct resource tpu41_resources[] = {
|
||||
[0] = {
|
||||
.name = "TPU41",
|
||||
.start = 0xe6640050,
|
||||
.end = 0xe6640075,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device leds_tpu41_device = {
|
||||
.name = "leds-renesas-tpu",
|
||||
.id = 41,
|
||||
.dev = {
|
||||
.platform_data = &led_renesas_tpu41_pdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(tpu41_resources),
|
||||
.resource = tpu41_resources,
|
||||
};
|
||||
|
||||
static struct led_renesas_tpu_config led_renesas_tpu21_pdata = {
|
||||
.name = "V2515",
|
||||
.pin_gpio_fn = GPIO_FN_TPU2TO1,
|
||||
.pin_gpio = GPIO_PORT197,
|
||||
.channel_offset = 0x50,
|
||||
.timer_bit = 1,
|
||||
.max_brightness = 1000,
|
||||
};
|
||||
|
||||
static struct resource tpu21_resources[] = {
|
||||
[0] = {
|
||||
.name = "TPU21",
|
||||
.start = 0xe6620050,
|
||||
.end = 0xe6620075,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device leds_tpu21_device = {
|
||||
.name = "leds-renesas-tpu",
|
||||
.id = 21,
|
||||
.dev = {
|
||||
.platform_data = &led_renesas_tpu21_pdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(tpu21_resources),
|
||||
.resource = tpu21_resources,
|
||||
};
|
||||
|
||||
static struct led_renesas_tpu_config led_renesas_tpu30_pdata = {
|
||||
.name = "KEYLED",
|
||||
.pin_gpio_fn = GPIO_FN_TPU3TO0,
|
||||
.pin_gpio = GPIO_PORT163,
|
||||
.channel_offset = 0x10,
|
||||
.timer_bit = 0,
|
||||
.max_brightness = 1000,
|
||||
};
|
||||
|
||||
static struct resource tpu30_resources[] = {
|
||||
[0] = {
|
||||
.name = "TPU30",
|
||||
.start = 0xe6630010,
|
||||
.end = 0xe6630035,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device leds_tpu30_device = {
|
||||
.name = "leds-renesas-tpu",
|
||||
.id = 30,
|
||||
.dev = {
|
||||
.platform_data = &led_renesas_tpu30_pdata,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(tpu30_resources),
|
||||
.resource = tpu30_resources,
|
||||
};
|
||||
|
||||
/* MMCIF */
|
||||
static struct resource mmcif_resources[] = {
|
||||
[0] = {
|
||||
|
@ -291,6 +401,10 @@ static struct platform_device *kota2_devices[] __initdata = {
|
|||
&keysc_device,
|
||||
&gpio_keys_device,
|
||||
&gpio_leds_device,
|
||||
&leds_tpu12_device,
|
||||
&leds_tpu41_device,
|
||||
&leds_tpu21_device,
|
||||
&leds_tpu30_device,
|
||||
&mmcif_device,
|
||||
&sdhi0_device,
|
||||
&sdhi1_device,
|
||||
|
@ -317,18 +431,6 @@ static void __init kota2_map_io(void)
|
|||
shmobile_setup_console();
|
||||
}
|
||||
|
||||
#define PINTER0A 0xe69000a0
|
||||
#define PINTCR0A 0xe69000b0
|
||||
|
||||
void __init kota2_init_irq(void)
|
||||
{
|
||||
sh73a0_init_irq();
|
||||
|
||||
/* setup PINT: enable PINTA2 as active low */
|
||||
__raw_writel(1 << 29, PINTER0A);
|
||||
__raw_writew(2 << 10, PINTCR0A);
|
||||
}
|
||||
|
||||
static void __init kota2_init(void)
|
||||
{
|
||||
sh73a0_pinmux_init();
|
||||
|
@ -447,7 +549,8 @@ struct sys_timer kota2_timer = {
|
|||
|
||||
MACHINE_START(KOTA2, "kota2")
|
||||
.map_io = kota2_map_io,
|
||||
.init_irq = kota2_init_irq,
|
||||
.nr_irqs = NR_IRQS_LEGACY,
|
||||
.init_irq = sh73a0_init_irq,
|
||||
.handle_irq = shmobile_handle_irq_gic,
|
||||
.init_machine = kota2_init,
|
||||
.timer = &kota2_timer,
|
||||
|
|
|
@ -113,6 +113,12 @@ static struct clk main_clk = {
|
|||
.ops = &main_clk_ops,
|
||||
};
|
||||
|
||||
/* Divide Main clock by two */
|
||||
static struct clk main_div2_clk = {
|
||||
.ops = &div2_clk_ops,
|
||||
.parent = &main_clk,
|
||||
};
|
||||
|
||||
/* PLL0, PLL1, PLL2, PLL3 */
|
||||
static unsigned long pll_recalc(struct clk *clk)
|
||||
{
|
||||
|
@ -181,6 +187,7 @@ static struct clk *main_clks[] = {
|
|||
&extal1_div2_clk,
|
||||
&extal2_div2_clk,
|
||||
&main_clk,
|
||||
&main_div2_clk,
|
||||
&pll0_clk,
|
||||
&pll1_clk,
|
||||
&pll2_clk,
|
||||
|
@ -243,7 +250,7 @@ static struct clk div6_clks[DIV6_NR] = {
|
|||
[DIV6_VCK1] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR1, 0),
|
||||
[DIV6_VCK2] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR2, 0),
|
||||
[DIV6_VCK3] = SH_CLK_DIV6(&pll1_div2_clk, VCLKCR3, 0),
|
||||
[DIV6_ZB1] = SH_CLK_DIV6(&pll1_div2_clk, ZBCKCR, 0),
|
||||
[DIV6_ZB1] = SH_CLK_DIV6(&pll1_div2_clk, ZBCKCR, CLK_ENABLE_ON_INIT),
|
||||
[DIV6_FLCTL] = SH_CLK_DIV6(&pll1_div2_clk, FLCKCR, 0),
|
||||
[DIV6_SDHI0] = SH_CLK_DIV6(&pll1_div2_clk, SD0CKCR, 0),
|
||||
[DIV6_SDHI1] = SH_CLK_DIV6(&pll1_div2_clk, SD1CKCR, 0),
|
||||
|
@ -268,6 +275,7 @@ enum { MSTP001,
|
|||
MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
|
||||
MSTP331, MSTP329, MSTP325, MSTP323, MSTP318,
|
||||
MSTP314, MSTP313, MSTP312, MSTP311,
|
||||
MSTP303, MSTP302, MSTP301, MSTP300,
|
||||
MSTP411, MSTP410, MSTP403,
|
||||
MSTP_NR };
|
||||
|
||||
|
@ -301,6 +309,10 @@ static struct clk mstp_clks[MSTP_NR] = {
|
|||
[MSTP313] = MSTP(&div6_clks[DIV6_SDHI1], SMSTPCR3, 13, 0), /* SDHI1 */
|
||||
[MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMCIF0 */
|
||||
[MSTP311] = MSTP(&div6_clks[DIV6_SDHI2], SMSTPCR3, 11, 0), /* SDHI2 */
|
||||
[MSTP303] = MSTP(&main_div2_clk, SMSTPCR3, 3, 0), /* TPU1 */
|
||||
[MSTP302] = MSTP(&main_div2_clk, SMSTPCR3, 2, 0), /* TPU2 */
|
||||
[MSTP301] = MSTP(&main_div2_clk, SMSTPCR3, 1, 0), /* TPU3 */
|
||||
[MSTP300] = MSTP(&main_div2_clk, SMSTPCR3, 0, 0), /* TPU4 */
|
||||
[MSTP411] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 11, 0), /* IIC3 */
|
||||
[MSTP410] = MSTP(&div4_clks[DIV4_HP], SMSTPCR4, 10, 0), /* IIC4 */
|
||||
[MSTP403] = MSTP(&r_clk, SMSTPCR4, 3, 0), /* KEYSC */
|
||||
|
@ -350,6 +362,10 @@ static struct clk_lookup lookups[] = {
|
|||
CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */
|
||||
CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */
|
||||
CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */
|
||||
CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */
|
||||
CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */
|
||||
CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */
|
||||
CLKDEV_DEV_ID("leds-renesas-tpu.41", &mstp_clks[MSTP300]), /* TPU4 */
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */
|
||||
CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */
|
||||
CLKDEV_DEV_ID("sh_keysc.0", &mstp_clks[MSTP403]), /* KEYSC */
|
||||
|
|
|
@ -363,11 +363,13 @@ __v7_setup:
|
|||
orreq r10, r10, #1 << 6 @ set bit #6
|
||||
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||
#endif
|
||||
#ifdef CONFIG_ARM_ERRATA_751472
|
||||
cmp r6, #0x30 @ present prior to r3p0
|
||||
#if defined(CONFIG_ARM_ERRATA_751472) && defined(CONFIG_SMP)
|
||||
ALT_SMP(cmp r6, #0x30) @ present prior to r3p0
|
||||
ALT_UP_B(1f)
|
||||
mrclt p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||
orrlt r10, r10, #1 << 11 @ set bit #11
|
||||
mcrlt p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||
1:
|
||||
#endif
|
||||
|
||||
3: mov r10, #0
|
||||
|
|
|
@ -116,7 +116,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|||
return oprofile_perf_init(ops);
|
||||
}
|
||||
|
||||
void __exit oprofile_arch_exit(void)
|
||||
void oprofile_arch_exit(void)
|
||||
{
|
||||
oprofile_perf_exit();
|
||||
}
|
||||
|
|
|
@ -98,7 +98,7 @@ static int mxc_set_target(struct cpufreq_policy *policy,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int __init mxc_cpufreq_init(struct cpufreq_policy *policy)
|
||||
static int mxc_cpufreq_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
int ret;
|
||||
int i;
|
||||
|
|
|
@ -98,6 +98,7 @@ static __inline__ void __arch_decomp_setup(unsigned long arch_id)
|
|||
case MACH_TYPE_PCM043:
|
||||
case MACH_TYPE_LILLY1131:
|
||||
case MACH_TYPE_VPR200:
|
||||
case MACH_TYPE_EUKREA_CPUIMX35SD:
|
||||
uart_base = MX3X_UART1_BASE_ADDR;
|
||||
break;
|
||||
case MACH_TYPE_MAGX_ZN5:
|
||||
|
|
|
@ -77,6 +77,15 @@ int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
|
|||
do_div(c, period_ns);
|
||||
duty_cycles = c;
|
||||
|
||||
/*
|
||||
* according to imx pwm RM, the real period value should be
|
||||
* PERIOD value in PWMPR plus 2.
|
||||
*/
|
||||
if (period_cycles > 2)
|
||||
period_cycles -= 2;
|
||||
else
|
||||
period_cycles = 0;
|
||||
|
||||
writel(duty_cycles, pwm->mmio_base + MX3_PWMSAR);
|
||||
writel(period_cycles, pwm->mmio_base + MX3_PWMPR);
|
||||
|
||||
|
|
|
@ -384,12 +384,16 @@ void __init orion_gpio_init(int gpio_base, int ngpio,
|
|||
struct orion_gpio_chip *ochip;
|
||||
struct irq_chip_generic *gc;
|
||||
struct irq_chip_type *ct;
|
||||
char gc_label[16];
|
||||
|
||||
if (orion_gpio_chip_count == ARRAY_SIZE(orion_gpio_chips))
|
||||
return;
|
||||
|
||||
snprintf(gc_label, sizeof(gc_label), "orion_gpio%d",
|
||||
orion_gpio_chip_count);
|
||||
|
||||
ochip = orion_gpio_chips + orion_gpio_chip_count;
|
||||
ochip->chip.label = "orion_gpio";
|
||||
ochip->chip.label = kstrdup(gc_label, GFP_KERNEL);
|
||||
ochip->chip.request = orion_gpio_request;
|
||||
ochip->chip.direction_input = orion_gpio_direction_input;
|
||||
ochip->chip.get = orion_gpio_get;
|
||||
|
|
|
@ -202,14 +202,6 @@ extern int s3c_plltab_register(struct cpufreq_frequency_table *plls,
|
|||
extern struct s3c_cpufreq_config *s3c_cpufreq_getconfig(void);
|
||||
extern struct s3c_iotimings *s3c_cpufreq_getiotimings(void);
|
||||
|
||||
extern void s3c2410_iotiming_debugfs(struct seq_file *seq,
|
||||
struct s3c_cpufreq_config *cfg,
|
||||
union s3c_iobank *iob);
|
||||
|
||||
extern void s3c2412_iotiming_debugfs(struct seq_file *seq,
|
||||
struct s3c_cpufreq_config *cfg,
|
||||
union s3c_iobank *iob);
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ_S3C24XX_DEBUGFS
|
||||
#define s3c_cpufreq_debugfs_call(x) x
|
||||
#else
|
||||
|
@ -226,6 +218,10 @@ extern void s3c2410_cpufreq_setrefresh(struct s3c_cpufreq_config *cfg);
|
|||
extern void s3c2410_set_fvco(struct s3c_cpufreq_config *cfg);
|
||||
|
||||
#ifdef CONFIG_S3C2410_IOTIMING
|
||||
extern void s3c2410_iotiming_debugfs(struct seq_file *seq,
|
||||
struct s3c_cpufreq_config *cfg,
|
||||
union s3c_iobank *iob);
|
||||
|
||||
extern int s3c2410_iotiming_calc(struct s3c_cpufreq_config *cfg,
|
||||
struct s3c_iotimings *iot);
|
||||
|
||||
|
@ -235,6 +231,7 @@ extern int s3c2410_iotiming_get(struct s3c_cpufreq_config *cfg,
|
|||
extern void s3c2410_iotiming_set(struct s3c_cpufreq_config *cfg,
|
||||
struct s3c_iotimings *iot);
|
||||
#else
|
||||
#define s3c2410_iotiming_debugfs NULL
|
||||
#define s3c2410_iotiming_calc NULL
|
||||
#define s3c2410_iotiming_get NULL
|
||||
#define s3c2410_iotiming_set NULL
|
||||
|
@ -242,8 +239,10 @@ extern void s3c2410_iotiming_set(struct s3c_cpufreq_config *cfg,
|
|||
|
||||
/* S3C2412 compatible routines */
|
||||
|
||||
extern int s3c2412_iotiming_get(struct s3c_cpufreq_config *cfg,
|
||||
struct s3c_iotimings *timings);
|
||||
#ifdef CONFIG_S3C2412_IOTIMING
|
||||
extern void s3c2412_iotiming_debugfs(struct seq_file *seq,
|
||||
struct s3c_cpufreq_config *cfg,
|
||||
union s3c_iobank *iob);
|
||||
|
||||
extern int s3c2412_iotiming_get(struct s3c_cpufreq_config *cfg,
|
||||
struct s3c_iotimings *timings);
|
||||
|
@ -253,6 +252,12 @@ extern int s3c2412_iotiming_calc(struct s3c_cpufreq_config *cfg,
|
|||
|
||||
extern void s3c2412_iotiming_set(struct s3c_cpufreq_config *cfg,
|
||||
struct s3c_iotimings *iot);
|
||||
#else
|
||||
#define s3c2412_iotiming_debugfs NULL
|
||||
#define s3c2412_iotiming_calc NULL
|
||||
#define s3c2412_iotiming_get NULL
|
||||
#define s3c2412_iotiming_set NULL
|
||||
#endif /* CONFIG_S3C2412_IOTIMING */
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ_S3C24XX_DEBUG
|
||||
#define s3c_freq_dbg(x...) printk(KERN_INFO x)
|
||||
|
|
|
@ -60,6 +60,7 @@ typedef u64 cputime64_t;
|
|||
*/
|
||||
#define cputime_to_usecs(__ct) ((__ct) / NSEC_PER_USEC)
|
||||
#define usecs_to_cputime(__usecs) ((__usecs) * NSEC_PER_USEC)
|
||||
#define usecs_to_cputime64(__usecs) usecs_to_cputime(__usecs)
|
||||
|
||||
/*
|
||||
* Convert cputime <-> seconds
|
||||
|
|
|
@ -150,6 +150,8 @@ static inline cputime_t usecs_to_cputime(const unsigned long us)
|
|||
return ct;
|
||||
}
|
||||
|
||||
#define usecs_to_cputime64(us) usecs_to_cputime(us)
|
||||
|
||||
/*
|
||||
* Convert cputime <-> seconds
|
||||
*/
|
||||
|
|
|
@ -381,39 +381,6 @@ static inline bool kvmppc_critical_section(struct kvm_vcpu *vcpu)
|
|||
}
|
||||
#endif
|
||||
|
||||
static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r,
|
||||
unsigned long pte_index)
|
||||
{
|
||||
unsigned long rb, va_low;
|
||||
|
||||
rb = (v & ~0x7fUL) << 16; /* AVA field */
|
||||
va_low = pte_index >> 3;
|
||||
if (v & HPTE_V_SECONDARY)
|
||||
va_low = ~va_low;
|
||||
/* xor vsid from AVA */
|
||||
if (!(v & HPTE_V_1TB_SEG))
|
||||
va_low ^= v >> 12;
|
||||
else
|
||||
va_low ^= v >> 24;
|
||||
va_low &= 0x7ff;
|
||||
if (v & HPTE_V_LARGE) {
|
||||
rb |= 1; /* L field */
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_206) &&
|
||||
(r & 0xff000)) {
|
||||
/* non-16MB large page, must be 64k */
|
||||
/* (masks depend on page size) */
|
||||
rb |= 0x1000; /* page encoding in LP field */
|
||||
rb |= (va_low & 0x7f) << 16; /* 7b of VA in AVA/LP field */
|
||||
rb |= (va_low & 0xfe); /* AVAL field (P7 doesn't seem to care) */
|
||||
}
|
||||
} else {
|
||||
/* 4kB page */
|
||||
rb |= (va_low & 0x7ff) << 12; /* remaining 11b of VA */
|
||||
}
|
||||
rb |= (v >> 54) & 0x300; /* B field */
|
||||
return rb;
|
||||
}
|
||||
|
||||
/* Magic register values loaded into r3 and r4 before the 'sc' assembly
|
||||
* instruction for the OSI hypercalls */
|
||||
#define OSI_SC_MAGIC_R3 0x113724FA
|
||||
|
|
|
@ -29,4 +29,37 @@ static inline struct kvmppc_book3s_shadow_vcpu *to_svcpu(struct kvm_vcpu *vcpu)
|
|||
|
||||
#define SPAPR_TCE_SHIFT 12
|
||||
|
||||
static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r,
|
||||
unsigned long pte_index)
|
||||
{
|
||||
unsigned long rb, va_low;
|
||||
|
||||
rb = (v & ~0x7fUL) << 16; /* AVA field */
|
||||
va_low = pte_index >> 3;
|
||||
if (v & HPTE_V_SECONDARY)
|
||||
va_low = ~va_low;
|
||||
/* xor vsid from AVA */
|
||||
if (!(v & HPTE_V_1TB_SEG))
|
||||
va_low ^= v >> 12;
|
||||
else
|
||||
va_low ^= v >> 24;
|
||||
va_low &= 0x7ff;
|
||||
if (v & HPTE_V_LARGE) {
|
||||
rb |= 1; /* L field */
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_206) &&
|
||||
(r & 0xff000)) {
|
||||
/* non-16MB large page, must be 64k */
|
||||
/* (masks depend on page size) */
|
||||
rb |= 0x1000; /* page encoding in LP field */
|
||||
rb |= (va_low & 0x7f) << 16; /* 7b of VA in AVA/LP field */
|
||||
rb |= (va_low & 0xfe); /* AVAL field (P7 doesn't seem to care) */
|
||||
}
|
||||
} else {
|
||||
/* 4kB page */
|
||||
rb |= (va_low & 0x7ff) << 12; /* remaining 11b of VA */
|
||||
}
|
||||
rb |= (v >> 54) & 0x300; /* B field */
|
||||
return rb;
|
||||
}
|
||||
|
||||
#endif /* __ASM_KVM_BOOK3S_64_H__ */
|
||||
|
|
|
@ -538,7 +538,7 @@ static void kvmppc_start_thread(struct kvm_vcpu *vcpu)
|
|||
tpaca->kvm_hstate.napping = 0;
|
||||
vcpu->cpu = vc->pcpu;
|
||||
smp_wmb();
|
||||
#ifdef CONFIG_PPC_ICP_NATIVE
|
||||
#if defined(CONFIG_PPC_ICP_NATIVE) && defined(CONFIG_SMP)
|
||||
if (vcpu->arch.ptid) {
|
||||
tpaca->cpu_start = 0x80;
|
||||
wmb();
|
||||
|
|
|
@ -658,10 +658,12 @@ program_interrupt:
|
|||
ulong cmd = kvmppc_get_gpr(vcpu, 3);
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_KVM_BOOK3S_64_PR
|
||||
if (kvmppc_h_pr(vcpu, cmd) == EMULATE_DONE) {
|
||||
r = RESUME_GUEST;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
run->papr_hcall.nr = cmd;
|
||||
for (i = 0; i < 9; ++i) {
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/kvm_host.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
#include <asm/reg.h>
|
||||
#include <asm/cputable.h>
|
||||
|
|
|
@ -87,6 +87,8 @@ usecs_to_cputime(const unsigned int m)
|
|||
return (cputime_t) m * 4096;
|
||||
}
|
||||
|
||||
#define usecs_to_cputime64(m) usecs_to_cputime(m)
|
||||
|
||||
/*
|
||||
* Convert cputime to milliseconds and back.
|
||||
*/
|
||||
|
|
|
@ -123,7 +123,7 @@ static ssize_t hwsampler_write(struct file *file, char const __user *buf,
|
|||
return -EINVAL;
|
||||
|
||||
retval = oprofilefs_ulong_from_user(&val, buf, count);
|
||||
if (retval)
|
||||
if (retval <= 0)
|
||||
return retval;
|
||||
|
||||
if (val != 0 && val != 1)
|
||||
|
|
|
@ -50,9 +50,9 @@ static struct platform_device heartbeat_device = {
|
|||
#define GBECONT 0xffc10100
|
||||
#define GBECONT_RMII1 BIT(17)
|
||||
#define GBECONT_RMII0 BIT(16)
|
||||
static void sh7757_eth_set_mdio_gate(unsigned long addr)
|
||||
static void sh7757_eth_set_mdio_gate(void *addr)
|
||||
{
|
||||
if ((addr & 0x00000fff) < 0x0800)
|
||||
if (((unsigned long)addr & 0x00000fff) < 0x0800)
|
||||
writel(readl(GBECONT) | GBECONT_RMII0, GBECONT);
|
||||
else
|
||||
writel(readl(GBECONT) | GBECONT_RMII1, GBECONT);
|
||||
|
@ -116,9 +116,9 @@ static struct platform_device sh7757_eth1_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static void sh7757_eth_giga_set_mdio_gate(unsigned long addr)
|
||||
static void sh7757_eth_giga_set_mdio_gate(void *addr)
|
||||
{
|
||||
if ((addr & 0x00000fff) < 0x0800) {
|
||||
if (((unsigned long)addr & 0x00000fff) < 0x0800) {
|
||||
gpio_set_value(GPIO_PTT4, 1);
|
||||
writel(readl(GBECONT) & ~GBECONT_RMII0, GBECONT);
|
||||
} else {
|
||||
|
@ -210,8 +210,12 @@ static struct resource sh_mmcif_resources[] = {
|
|||
};
|
||||
|
||||
static struct sh_mmcif_dma sh7757lcr_mmcif_dma = {
|
||||
.chan_priv_tx = SHDMA_SLAVE_MMCIF_TX,
|
||||
.chan_priv_rx = SHDMA_SLAVE_MMCIF_RX,
|
||||
.chan_priv_tx = {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_TX,
|
||||
},
|
||||
.chan_priv_rx = {
|
||||
.slave_id = SHDMA_SLAVE_MMCIF_RX,
|
||||
}
|
||||
};
|
||||
|
||||
static struct sh_mmcif_plat_data sh_mmcif_plat = {
|
||||
|
|
|
@ -49,7 +49,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|||
return oprofile_perf_init(ops);
|
||||
}
|
||||
|
||||
void __exit oprofile_arch_exit(void)
|
||||
void oprofile_arch_exit(void)
|
||||
{
|
||||
oprofile_perf_exit();
|
||||
kfree(sh_pmu_op_name);
|
||||
|
@ -60,5 +60,5 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|||
ops->backtrace = sh_backtrace;
|
||||
return -ENODEV;
|
||||
}
|
||||
void __exit oprofile_arch_exit(void) {}
|
||||
void oprofile_arch_exit(void) {}
|
||||
#endif /* CONFIG_HW_PERF_EVENTS */
|
||||
|
|
|
@ -849,10 +849,10 @@ static int pci_sun4v_msiq_build_irq(struct pci_pbm_info *pbm,
|
|||
if (!irq)
|
||||
return -ENOMEM;
|
||||
|
||||
if (pci_sun4v_msiq_setstate(pbm->devhandle, msiqid, HV_MSIQSTATE_IDLE))
|
||||
return -EINVAL;
|
||||
if (pci_sun4v_msiq_setvalid(pbm->devhandle, msiqid, HV_MSIQ_VALID))
|
||||
return -EINVAL;
|
||||
if (pci_sun4v_msiq_setstate(pbm->devhandle, msiqid, HV_MSIQSTATE_IDLE))
|
||||
return -EINVAL;
|
||||
|
||||
return irq;
|
||||
}
|
||||
|
|
|
@ -1165,7 +1165,7 @@ again:
|
|||
*/
|
||||
c = &unconstrained;
|
||||
} else if (intel_try_alt_er(event, orig_idx)) {
|
||||
raw_spin_unlock(&era->lock);
|
||||
raw_spin_unlock_irqrestore(&era->lock, flags);
|
||||
goto again;
|
||||
}
|
||||
raw_spin_unlock_irqrestore(&era->lock, flags);
|
||||
|
|
|
@ -116,16 +116,16 @@ void show_registers(struct pt_regs *regs)
|
|||
for (i = 0; i < code_len; i++, ip++) {
|
||||
if (ip < (u8 *)PAGE_OFFSET ||
|
||||
probe_kernel_address(ip, c)) {
|
||||
printk(" Bad EIP value.");
|
||||
printk(KERN_CONT " Bad EIP value.");
|
||||
break;
|
||||
}
|
||||
if (ip == (u8 *)regs->ip)
|
||||
printk("<%02x> ", c);
|
||||
printk(KERN_CONT "<%02x> ", c);
|
||||
else
|
||||
printk("%02x ", c);
|
||||
printk(KERN_CONT "%02x ", c);
|
||||
}
|
||||
}
|
||||
printk("\n");
|
||||
printk(KERN_CONT "\n");
|
||||
}
|
||||
|
||||
int is_valid_bugaddr(unsigned long ip)
|
||||
|
|
|
@ -284,16 +284,16 @@ void show_registers(struct pt_regs *regs)
|
|||
for (i = 0; i < code_len; i++, ip++) {
|
||||
if (ip < (u8 *)PAGE_OFFSET ||
|
||||
probe_kernel_address(ip, c)) {
|
||||
printk(" Bad RIP value.");
|
||||
printk(KERN_CONT " Bad RIP value.");
|
||||
break;
|
||||
}
|
||||
if (ip == (u8 *)regs->ip)
|
||||
printk("<%02x> ", c);
|
||||
printk(KERN_CONT "<%02x> ", c);
|
||||
else
|
||||
printk("%02x ", c);
|
||||
printk(KERN_CONT "%02x ", c);
|
||||
}
|
||||
}
|
||||
printk("\n");
|
||||
printk(KERN_CONT "\n");
|
||||
}
|
||||
|
||||
int is_valid_bugaddr(unsigned long ip)
|
||||
|
|
|
@ -338,11 +338,15 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data)
|
|||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
static void create_pit_timer(struct kvm_kpit_state *ps, u32 val, int is_period)
|
||||
static void create_pit_timer(struct kvm *kvm, u32 val, int is_period)
|
||||
{
|
||||
struct kvm_kpit_state *ps = &kvm->arch.vpit->pit_state;
|
||||
struct kvm_timer *pt = &ps->pit_timer;
|
||||
s64 interval;
|
||||
|
||||
if (!irqchip_in_kernel(kvm))
|
||||
return;
|
||||
|
||||
interval = muldiv64(val, NSEC_PER_SEC, KVM_PIT_FREQ);
|
||||
|
||||
pr_debug("create pit timer, interval is %llu nsec\n", interval);
|
||||
|
@ -394,13 +398,13 @@ static void pit_load_count(struct kvm *kvm, int channel, u32 val)
|
|||
/* FIXME: enhance mode 4 precision */
|
||||
case 4:
|
||||
if (!(ps->flags & KVM_PIT_FLAGS_HPET_LEGACY)) {
|
||||
create_pit_timer(ps, val, 0);
|
||||
create_pit_timer(kvm, val, 0);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
if (!(ps->flags & KVM_PIT_FLAGS_HPET_LEGACY)){
|
||||
create_pit_timer(ps, val, 1);
|
||||
create_pit_timer(kvm, val, 1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -602,7 +602,6 @@ static void update_cpuid(struct kvm_vcpu *vcpu)
|
|||
{
|
||||
struct kvm_cpuid_entry2 *best;
|
||||
struct kvm_lapic *apic = vcpu->arch.apic;
|
||||
u32 timer_mode_mask;
|
||||
|
||||
best = kvm_find_cpuid_entry(vcpu, 1, 0);
|
||||
if (!best)
|
||||
|
@ -615,15 +614,12 @@ static void update_cpuid(struct kvm_vcpu *vcpu)
|
|||
best->ecx |= bit(X86_FEATURE_OSXSAVE);
|
||||
}
|
||||
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
|
||||
best->function == 0x1) {
|
||||
best->ecx |= bit(X86_FEATURE_TSC_DEADLINE_TIMER);
|
||||
timer_mode_mask = 3 << 17;
|
||||
} else
|
||||
timer_mode_mask = 1 << 17;
|
||||
|
||||
if (apic)
|
||||
apic->lapic_timer.timer_mode_mask = timer_mode_mask;
|
||||
if (apic) {
|
||||
if (best->ecx & bit(X86_FEATURE_TSC_DEADLINE_TIMER))
|
||||
apic->lapic_timer.timer_mode_mask = 3 << 17;
|
||||
else
|
||||
apic->lapic_timer.timer_mode_mask = 1 << 17;
|
||||
}
|
||||
}
|
||||
|
||||
int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
|
||||
|
@ -2135,6 +2131,9 @@ int kvm_dev_ioctl_check_extension(long ext)
|
|||
case KVM_CAP_TSC_CONTROL:
|
||||
r = kvm_has_tsc_control;
|
||||
break;
|
||||
case KVM_CAP_TSC_DEADLINE_TIMER:
|
||||
r = boot_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER);
|
||||
break;
|
||||
default:
|
||||
r = 0;
|
||||
break;
|
||||
|
|
|
@ -568,8 +568,8 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
|
|||
break;
|
||||
}
|
||||
if (filter[i].jt != 0) {
|
||||
if (filter[i].jf)
|
||||
t_offset += is_near(f_offset) ? 2 : 6;
|
||||
if (filter[i].jf && f_offset)
|
||||
t_offset += is_near(f_offset) ? 2 : 5;
|
||||
EMIT_COND_JMP(t_op, t_offset);
|
||||
if (filter[i].jf)
|
||||
EMIT_JMP(f_offset);
|
||||
|
|
|
@ -311,7 +311,7 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf,
|
|||
if (IS_ERR(bio))
|
||||
return PTR_ERR(bio);
|
||||
|
||||
if (rq_data_dir(rq) == WRITE)
|
||||
if (!reading)
|
||||
bio->bi_rw |= REQ_WRITE;
|
||||
|
||||
if (do_copy)
|
||||
|
|
|
@ -282,18 +282,9 @@ EXPORT_SYMBOL(blk_queue_resize_tags);
|
|||
void blk_queue_end_tag(struct request_queue *q, struct request *rq)
|
||||
{
|
||||
struct blk_queue_tag *bqt = q->queue_tags;
|
||||
int tag = rq->tag;
|
||||
unsigned tag = rq->tag; /* negative tags invalid */
|
||||
|
||||
BUG_ON(tag == -1);
|
||||
|
||||
if (unlikely(tag >= bqt->max_depth)) {
|
||||
/*
|
||||
* This can happen after tag depth has been reduced.
|
||||
* But tag shouldn't be larger than real_max_depth.
|
||||
*/
|
||||
WARN_ON(tag >= bqt->real_max_depth);
|
||||
return;
|
||||
}
|
||||
BUG_ON(tag >= bqt->real_max_depth);
|
||||
|
||||
list_del_init(&rq->queuelist);
|
||||
rq->cmd_flags &= ~REQ_QUEUED;
|
||||
|
|
|
@ -1655,6 +1655,8 @@ cfq_merged_requests(struct request_queue *q, struct request *rq,
|
|||
struct request *next)
|
||||
{
|
||||
struct cfq_queue *cfqq = RQ_CFQQ(rq);
|
||||
struct cfq_data *cfqd = q->elevator->elevator_data;
|
||||
|
||||
/*
|
||||
* reposition in fifo if next is older than rq
|
||||
*/
|
||||
|
@ -1669,6 +1671,16 @@ cfq_merged_requests(struct request_queue *q, struct request *rq,
|
|||
cfq_remove_request(next);
|
||||
cfq_blkiocg_update_io_merged_stats(&(RQ_CFQG(rq))->blkg,
|
||||
rq_data_dir(next), rq_is_sync(next));
|
||||
|
||||
cfqq = RQ_CFQQ(next);
|
||||
/*
|
||||
* all requests of this queue are merged to other queues, delete it
|
||||
* from the service tree. If it's the active_queue,
|
||||
* cfq_dispatch_requests() will choose to expire it or do idle
|
||||
*/
|
||||
if (cfq_cfqq_on_rr(cfqq) && RB_EMPTY_ROOT(&cfqq->sort_list) &&
|
||||
cfqq != cfqd->active_queue)
|
||||
cfq_del_cfqq_rr(cfqd, cfqq);
|
||||
}
|
||||
|
||||
static int cfq_allow_merge(struct request_queue *q, struct request *rq,
|
||||
|
|
|
@ -820,7 +820,7 @@ config PATA_PLATFORM
|
|||
|
||||
config PATA_OF_PLATFORM
|
||||
tristate "OpenFirmware platform device PATA support"
|
||||
depends on PATA_PLATFORM && OF
|
||||
depends on PATA_PLATFORM && OF && OF_IRQ
|
||||
help
|
||||
This option enables support for generic directly connected ATA
|
||||
devices commonly found on embedded systems with OpenFirmware
|
||||
|
|
|
@ -139,6 +139,8 @@
|
|||
#define IPMI_WDOG_SET_TIMER 0x24
|
||||
#define IPMI_WDOG_GET_TIMER 0x25
|
||||
|
||||
#define IPMI_WDOG_TIMER_NOT_INIT_RESP 0x80
|
||||
|
||||
/* These are here until the real ones get into the watchdog.h interface. */
|
||||
#ifndef WDIOC_GETTIMEOUT
|
||||
#define WDIOC_GETTIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 20, int)
|
||||
|
@ -596,6 +598,7 @@ static int ipmi_heartbeat(void)
|
|||
struct kernel_ipmi_msg msg;
|
||||
int rv;
|
||||
struct ipmi_system_interface_addr addr;
|
||||
int timeout_retries = 0;
|
||||
|
||||
if (ipmi_ignore_heartbeat)
|
||||
return 0;
|
||||
|
@ -616,6 +619,7 @@ static int ipmi_heartbeat(void)
|
|||
|
||||
mutex_lock(&heartbeat_lock);
|
||||
|
||||
restart:
|
||||
atomic_set(&heartbeat_tofree, 2);
|
||||
|
||||
/*
|
||||
|
@ -653,7 +657,33 @@ static int ipmi_heartbeat(void)
|
|||
/* Wait for the heartbeat to be sent. */
|
||||
wait_for_completion(&heartbeat_wait);
|
||||
|
||||
if (heartbeat_recv_msg.msg.data[0] != 0) {
|
||||
if (heartbeat_recv_msg.msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP) {
|
||||
timeout_retries++;
|
||||
if (timeout_retries > 3) {
|
||||
printk(KERN_ERR PFX ": Unable to restore the IPMI"
|
||||
" watchdog's settings, giving up.\n");
|
||||
rv = -EIO;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
* The timer was not initialized, that means the BMC was
|
||||
* probably reset and lost the watchdog information. Attempt
|
||||
* to restore the timer's info. Note that we still hold
|
||||
* the heartbeat lock, to keep a heartbeat from happening
|
||||
* in this process, so must say no heartbeat to avoid a
|
||||
* deadlock on this mutex.
|
||||
*/
|
||||
rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
|
||||
if (rv) {
|
||||
printk(KERN_ERR PFX ": Unable to send the command to"
|
||||
" set the watchdog's settings, giving up.\n");
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* We might need a new heartbeat, so do it now */
|
||||
goto restart;
|
||||
} else if (heartbeat_recv_msg.msg.data[0] != 0) {
|
||||
/*
|
||||
* Got an error in the heartbeat response. It was already
|
||||
* reported in ipmi_wdog_msg_handler, but we should return
|
||||
|
@ -662,6 +692,7 @@ static int ipmi_heartbeat(void)
|
|||
rv = -EINVAL;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&heartbeat_lock);
|
||||
|
||||
return rv;
|
||||
|
@ -922,11 +953,15 @@ static struct miscdevice ipmi_wdog_miscdev = {
|
|||
static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg,
|
||||
void *handler_data)
|
||||
{
|
||||
if (msg->msg.data[0] != 0) {
|
||||
if (msg->msg.cmd == IPMI_WDOG_RESET_TIMER &&
|
||||
msg->msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP)
|
||||
printk(KERN_INFO PFX "response: The IPMI controller appears"
|
||||
" to have been reset, will attempt to reinitialize"
|
||||
" the watchdog timer\n");
|
||||
else if (msg->msg.data[0] != 0)
|
||||
printk(KERN_ERR PFX "response: Error %x on cmd %x\n",
|
||||
msg->msg.data[0],
|
||||
msg->msg.cmd);
|
||||
}
|
||||
|
||||
ipmi_free_recv_msg(msg);
|
||||
}
|
||||
|
|
|
@ -124,7 +124,7 @@ config MV_XOR
|
|||
|
||||
config MX3_IPU
|
||||
bool "MX3x Image Processing Unit support"
|
||||
depends on ARCH_MX3
|
||||
depends on SOC_IMX31 || SOC_IMX35
|
||||
select DMA_ENGINE
|
||||
default y
|
||||
help
|
||||
|
@ -216,7 +216,7 @@ config PCH_DMA
|
|||
|
||||
config IMX_SDMA
|
||||
tristate "i.MX SDMA support"
|
||||
depends on ARCH_MX25 || ARCH_MX3 || ARCH_MX5
|
||||
depends on ARCH_MX25 || SOC_IMX31 || SOC_IMX35 || ARCH_MX5
|
||||
select DMA_ENGINE
|
||||
help
|
||||
Support the i.MX SDMA engine. This engine is integrated into
|
||||
|
|
|
@ -756,9 +756,9 @@ intel_enable_semaphores(struct drm_device *dev)
|
|||
if (i915_semaphores >= 0)
|
||||
return i915_semaphores;
|
||||
|
||||
/* Enable semaphores on SNB when IO remapping is off */
|
||||
/* Disable semaphores on SNB */
|
||||
if (INTEL_INFO(dev)->gen == 6)
|
||||
return !intel_iommu_enabled;
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -7922,13 +7922,11 @@ static bool intel_enable_rc6(struct drm_device *dev)
|
|||
return 0;
|
||||
|
||||
/*
|
||||
* Enable rc6 on Sandybridge if DMA remapping is disabled
|
||||
* Disable rc6 on Sandybridge
|
||||
*/
|
||||
if (INTEL_INFO(dev)->gen == 6) {
|
||||
DRM_DEBUG_DRIVER("Sandybridge: intel_iommu_enabled %s -- RC6 %sabled\n",
|
||||
intel_iommu_enabled ? "true" : "false",
|
||||
!intel_iommu_enabled ? "en" : "dis");
|
||||
return !intel_iommu_enabled;
|
||||
DRM_DEBUG_DRIVER("Sandybridge: RC6 disabled\n");
|
||||
return 0;
|
||||
}
|
||||
DRM_DEBUG_DRIVER("RC6 enabled\n");
|
||||
return 1;
|
||||
|
|
|
@ -3276,6 +3276,18 @@ int evergreen_init(struct radeon_device *rdev)
|
|||
rdev->accel_working = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Don't start up if the MC ucode is missing on BTC parts.
|
||||
* The default clocks and voltages before the MC ucode
|
||||
* is loaded are not suffient for advanced operations.
|
||||
*/
|
||||
if (ASIC_IS_DCE5(rdev)) {
|
||||
if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) {
|
||||
DRM_ERROR("radeon: MC ucode required for NI+.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -2560,7 +2560,11 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
|
|||
|
||||
rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
|
||||
rdev->pm.current_clock_mode_index = 0;
|
||||
rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
|
||||
if (rdev->pm.default_power_state_index >= 0)
|
||||
rdev->pm.current_vddc =
|
||||
rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
|
||||
else
|
||||
rdev->pm.current_vddc = 0;
|
||||
}
|
||||
|
||||
void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable)
|
||||
|
|
|
@ -390,6 +390,11 @@ extern int vmw_context_check(struct vmw_private *dev_priv,
|
|||
struct ttm_object_file *tfile,
|
||||
int id,
|
||||
struct vmw_resource **p_res);
|
||||
extern int vmw_user_lookup_handle(struct vmw_private *dev_priv,
|
||||
struct ttm_object_file *tfile,
|
||||
uint32_t handle,
|
||||
struct vmw_surface **out_surf,
|
||||
struct vmw_dma_buffer **out_buf);
|
||||
extern void vmw_surface_res_free(struct vmw_resource *res);
|
||||
extern int vmw_surface_init(struct vmw_private *dev_priv,
|
||||
struct vmw_surface *srf,
|
||||
|
|
|
@ -33,6 +33,7 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv)
|
|||
{
|
||||
__le32 __iomem *fifo_mem = dev_priv->mmio_virt;
|
||||
uint32_t fifo_min, hwversion;
|
||||
const struct vmw_fifo_state *fifo = &dev_priv->fifo;
|
||||
|
||||
if (!(dev_priv->capabilities & SVGA_CAP_EXTENDED_FIFO))
|
||||
return false;
|
||||
|
@ -41,7 +42,12 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv)
|
|||
if (fifo_min <= SVGA_FIFO_3D_HWVERSION * sizeof(unsigned int))
|
||||
return false;
|
||||
|
||||
hwversion = ioread32(fifo_mem + SVGA_FIFO_3D_HWVERSION);
|
||||
hwversion = ioread32(fifo_mem +
|
||||
((fifo->capabilities &
|
||||
SVGA_FIFO_CAP_3D_HWVERSION_REVISED) ?
|
||||
SVGA_FIFO_3D_HWVERSION_REVISED :
|
||||
SVGA_FIFO_3D_HWVERSION));
|
||||
|
||||
if (hwversion == 0)
|
||||
return false;
|
||||
|
||||
|
|
|
@ -58,8 +58,14 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data,
|
|||
case DRM_VMW_PARAM_FIFO_HW_VERSION:
|
||||
{
|
||||
__le32 __iomem *fifo_mem = dev_priv->mmio_virt;
|
||||
const struct vmw_fifo_state *fifo = &dev_priv->fifo;
|
||||
|
||||
param->value = ioread32(fifo_mem + SVGA_FIFO_3D_HWVERSION);
|
||||
param->value =
|
||||
ioread32(fifo_mem +
|
||||
((fifo->capabilities &
|
||||
SVGA_FIFO_CAP_3D_HWVERSION_REVISED) ?
|
||||
SVGA_FIFO_3D_HWVERSION_REVISED :
|
||||
SVGA_FIFO_3D_HWVERSION));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -166,13 +172,7 @@ int vmw_present_ioctl(struct drm_device *dev, void *data,
|
|||
ret = -EINVAL;
|
||||
goto out_no_fb;
|
||||
}
|
||||
|
||||
vfb = vmw_framebuffer_to_vfb(obj_to_fb(obj));
|
||||
if (!vfb->dmabuf) {
|
||||
DRM_ERROR("Framebuffer not dmabuf backed.\n");
|
||||
ret = -EINVAL;
|
||||
goto out_no_fb;
|
||||
}
|
||||
|
||||
ret = ttm_read_lock(&vmaster->lock, true);
|
||||
if (unlikely(ret != 0))
|
||||
|
|
|
@ -31,6 +31,44 @@
|
|||
/* Might need a hrtimer here? */
|
||||
#define VMWGFX_PRESENT_RATE ((HZ / 60 > 0) ? HZ / 60 : 1)
|
||||
|
||||
|
||||
struct vmw_clip_rect {
|
||||
int x1, x2, y1, y2;
|
||||
};
|
||||
|
||||
/**
|
||||
* Clip @num_rects number of @rects against @clip storing the
|
||||
* results in @out_rects and the number of passed rects in @out_num.
|
||||
*/
|
||||
void vmw_clip_cliprects(struct drm_clip_rect *rects,
|
||||
int num_rects,
|
||||
struct vmw_clip_rect clip,
|
||||
SVGASignedRect *out_rects,
|
||||
int *out_num)
|
||||
{
|
||||
int i, k;
|
||||
|
||||
for (i = 0, k = 0; i < num_rects; i++) {
|
||||
int x1 = max_t(int, clip.x1, rects[i].x1);
|
||||
int y1 = max_t(int, clip.y1, rects[i].y1);
|
||||
int x2 = min_t(int, clip.x2, rects[i].x2);
|
||||
int y2 = min_t(int, clip.y2, rects[i].y2);
|
||||
|
||||
if (x1 >= x2)
|
||||
continue;
|
||||
if (y1 >= y2)
|
||||
continue;
|
||||
|
||||
out_rects[k].left = x1;
|
||||
out_rects[k].top = y1;
|
||||
out_rects[k].right = x2;
|
||||
out_rects[k].bottom = y2;
|
||||
k++;
|
||||
}
|
||||
|
||||
*out_num = k;
|
||||
}
|
||||
|
||||
void vmw_display_unit_cleanup(struct vmw_display_unit *du)
|
||||
{
|
||||
if (du->cursor_surface)
|
||||
|
@ -82,6 +120,43 @@ int vmw_cursor_update_image(struct vmw_private *dev_priv,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv,
|
||||
struct vmw_dma_buffer *dmabuf,
|
||||
u32 width, u32 height,
|
||||
u32 hotspotX, u32 hotspotY)
|
||||
{
|
||||
struct ttm_bo_kmap_obj map;
|
||||
unsigned long kmap_offset;
|
||||
unsigned long kmap_num;
|
||||
void *virtual;
|
||||
bool dummy;
|
||||
int ret;
|
||||
|
||||
kmap_offset = 0;
|
||||
kmap_num = (width*height*4 + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
|
||||
ret = ttm_bo_reserve(&dmabuf->base, true, false, false, 0);
|
||||
if (unlikely(ret != 0)) {
|
||||
DRM_ERROR("reserve failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = ttm_bo_kmap(&dmabuf->base, kmap_offset, kmap_num, &map);
|
||||
if (unlikely(ret != 0))
|
||||
goto err_unreserve;
|
||||
|
||||
virtual = ttm_kmap_obj_virtual(&map, &dummy);
|
||||
ret = vmw_cursor_update_image(dev_priv, virtual, width, height,
|
||||
hotspotX, hotspotY);
|
||||
|
||||
ttm_bo_kunmap(&map);
|
||||
err_unreserve:
|
||||
ttm_bo_unreserve(&dmabuf->base);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void vmw_cursor_update_position(struct vmw_private *dev_priv,
|
||||
bool show, int x, int y)
|
||||
{
|
||||
|
@ -110,24 +185,21 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
|
|||
return -EINVAL;
|
||||
|
||||
if (handle) {
|
||||
ret = vmw_user_surface_lookup_handle(dev_priv, tfile,
|
||||
handle, &surface);
|
||||
if (!ret) {
|
||||
if (!surface->snooper.image) {
|
||||
DRM_ERROR("surface not suitable for cursor\n");
|
||||
vmw_surface_unreference(&surface);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
ret = vmw_user_dmabuf_lookup(tfile,
|
||||
handle, &dmabuf);
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to find surface or dmabuf: %i\n", ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = vmw_user_lookup_handle(dev_priv, tfile,
|
||||
handle, &surface, &dmabuf);
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to find surface or dmabuf: %i\n", ret);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/* need to do this before taking down old image */
|
||||
if (surface && !surface->snooper.image) {
|
||||
DRM_ERROR("surface not suitable for cursor\n");
|
||||
vmw_surface_unreference(&surface);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* takedown old cursor */
|
||||
if (du->cursor_surface) {
|
||||
du->cursor_surface->snooper.crtc = NULL;
|
||||
|
@ -146,36 +218,11 @@ int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
|
|||
vmw_cursor_update_image(dev_priv, surface->snooper.image,
|
||||
64, 64, du->hotspot_x, du->hotspot_y);
|
||||
} else if (dmabuf) {
|
||||
struct ttm_bo_kmap_obj map;
|
||||
unsigned long kmap_offset;
|
||||
unsigned long kmap_num;
|
||||
void *virtual;
|
||||
bool dummy;
|
||||
|
||||
/* vmw_user_surface_lookup takes one reference */
|
||||
du->cursor_dmabuf = dmabuf;
|
||||
|
||||
kmap_offset = 0;
|
||||
kmap_num = (64*64*4) >> PAGE_SHIFT;
|
||||
|
||||
ret = ttm_bo_reserve(&dmabuf->base, true, false, false, 0);
|
||||
if (unlikely(ret != 0)) {
|
||||
DRM_ERROR("reserve failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = ttm_bo_kmap(&dmabuf->base, kmap_offset, kmap_num, &map);
|
||||
if (unlikely(ret != 0))
|
||||
goto err_unreserve;
|
||||
|
||||
virtual = ttm_kmap_obj_virtual(&map, &dummy);
|
||||
vmw_cursor_update_image(dev_priv, virtual, 64, 64,
|
||||
du->hotspot_x, du->hotspot_y);
|
||||
|
||||
ttm_bo_kunmap(&map);
|
||||
err_unreserve:
|
||||
ttm_bo_unreserve(&dmabuf->base);
|
||||
|
||||
ret = vmw_cursor_update_dmabuf(dev_priv, dmabuf, width, height,
|
||||
du->hotspot_x, du->hotspot_y);
|
||||
} else {
|
||||
vmw_cursor_update_position(dev_priv, false, 0, 0);
|
||||
return 0;
|
||||
|
@ -377,8 +424,9 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv,
|
|||
struct drm_clip_rect *clips,
|
||||
unsigned num_clips, int inc)
|
||||
{
|
||||
struct drm_clip_rect *clips_ptr;
|
||||
struct vmw_display_unit *units[VMWGFX_NUM_DISPLAY_UNITS];
|
||||
struct drm_clip_rect *clips_ptr;
|
||||
struct drm_clip_rect *tmp;
|
||||
struct drm_crtc *crtc;
|
||||
size_t fifo_size;
|
||||
int i, num_units;
|
||||
|
@ -391,7 +439,6 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv,
|
|||
} *cmd;
|
||||
SVGASignedRect *blits;
|
||||
|
||||
|
||||
num_units = 0;
|
||||
list_for_each_entry(crtc, &dev_priv->dev->mode_config.crtc_list,
|
||||
head) {
|
||||
|
@ -402,13 +449,24 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv,
|
|||
|
||||
BUG_ON(!clips || !num_clips);
|
||||
|
||||
tmp = kzalloc(sizeof(*tmp) * num_clips, GFP_KERNEL);
|
||||
if (unlikely(tmp == NULL)) {
|
||||
DRM_ERROR("Temporary cliprect memory alloc failed.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num_clips;
|
||||
cmd = kzalloc(fifo_size, GFP_KERNEL);
|
||||
if (unlikely(cmd == NULL)) {
|
||||
DRM_ERROR("Temporary fifo memory alloc failed.\n");
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto out_free_tmp;
|
||||
}
|
||||
|
||||
/* setup blits pointer */
|
||||
blits = (SVGASignedRect *)&cmd[1];
|
||||
|
||||
/* initial clip region */
|
||||
left = clips->x1;
|
||||
right = clips->x2;
|
||||
top = clips->y1;
|
||||
|
@ -434,45 +492,60 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv,
|
|||
cmd->body.srcRect.bottom = bottom;
|
||||
|
||||
clips_ptr = clips;
|
||||
blits = (SVGASignedRect *)&cmd[1];
|
||||
for (i = 0; i < num_clips; i++, clips_ptr += inc) {
|
||||
blits[i].left = clips_ptr->x1 - left;
|
||||
blits[i].right = clips_ptr->x2 - left;
|
||||
blits[i].top = clips_ptr->y1 - top;
|
||||
blits[i].bottom = clips_ptr->y2 - top;
|
||||
tmp[i].x1 = clips_ptr->x1 - left;
|
||||
tmp[i].x2 = clips_ptr->x2 - left;
|
||||
tmp[i].y1 = clips_ptr->y1 - top;
|
||||
tmp[i].y2 = clips_ptr->y2 - top;
|
||||
}
|
||||
|
||||
/* do per unit writing, reuse fifo for each */
|
||||
for (i = 0; i < num_units; i++) {
|
||||
struct vmw_display_unit *unit = units[i];
|
||||
int clip_x1 = left - unit->crtc.x;
|
||||
int clip_y1 = top - unit->crtc.y;
|
||||
int clip_x2 = right - unit->crtc.x;
|
||||
int clip_y2 = bottom - unit->crtc.y;
|
||||
struct vmw_clip_rect clip;
|
||||
int num;
|
||||
|
||||
clip.x1 = left - unit->crtc.x;
|
||||
clip.y1 = top - unit->crtc.y;
|
||||
clip.x2 = right - unit->crtc.x;
|
||||
clip.y2 = bottom - unit->crtc.y;
|
||||
|
||||
/* skip any crtcs that misses the clip region */
|
||||
if (clip_x1 >= unit->crtc.mode.hdisplay ||
|
||||
clip_y1 >= unit->crtc.mode.vdisplay ||
|
||||
clip_x2 <= 0 || clip_y2 <= 0)
|
||||
if (clip.x1 >= unit->crtc.mode.hdisplay ||
|
||||
clip.y1 >= unit->crtc.mode.vdisplay ||
|
||||
clip.x2 <= 0 || clip.y2 <= 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* In order for the clip rects to be correctly scaled
|
||||
* the src and dest rects needs to be the same size.
|
||||
*/
|
||||
cmd->body.destRect.left = clip.x1;
|
||||
cmd->body.destRect.right = clip.x2;
|
||||
cmd->body.destRect.top = clip.y1;
|
||||
cmd->body.destRect.bottom = clip.y2;
|
||||
|
||||
/* create a clip rect of the crtc in dest coords */
|
||||
clip.x2 = unit->crtc.mode.hdisplay - clip.x1;
|
||||
clip.y2 = unit->crtc.mode.vdisplay - clip.y1;
|
||||
clip.x1 = 0 - clip.x1;
|
||||
clip.y1 = 0 - clip.y1;
|
||||
|
||||
/* need to reset sid as it is changed by execbuf */
|
||||
cmd->body.srcImage.sid = cpu_to_le32(framebuffer->user_handle);
|
||||
|
||||
cmd->body.destScreenId = unit->unit;
|
||||
|
||||
/*
|
||||
* The blit command is a lot more resilient then the
|
||||
* readback command when it comes to clip rects. So its
|
||||
* okay to go out of bounds.
|
||||
*/
|
||||
/* clip and write blits to cmd stream */
|
||||
vmw_clip_cliprects(tmp, num_clips, clip, blits, &num);
|
||||
|
||||
cmd->body.destRect.left = clip_x1;
|
||||
cmd->body.destRect.right = clip_x2;
|
||||
cmd->body.destRect.top = clip_y1;
|
||||
cmd->body.destRect.bottom = clip_y2;
|
||||
/* if no cliprects hit skip this */
|
||||
if (num == 0)
|
||||
continue;
|
||||
|
||||
|
||||
/* recalculate package length */
|
||||
fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num;
|
||||
cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header));
|
||||
ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd,
|
||||
fifo_size, 0, NULL);
|
||||
|
||||
|
@ -480,7 +553,10 @@ static int do_surface_dirty_sou(struct vmw_private *dev_priv,
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
kfree(cmd);
|
||||
out_free_tmp:
|
||||
kfree(tmp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -556,6 +632,10 @@ static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
|
|||
* Sanity checks.
|
||||
*/
|
||||
|
||||
/* Surface must be marked as a scanout. */
|
||||
if (unlikely(!surface->scanout))
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(surface->mip_levels[0] != 1 ||
|
||||
surface->num_sizes != 1 ||
|
||||
surface->sizes[0].width < mode_cmd->width ||
|
||||
|
@ -782,6 +862,7 @@ static int do_dmabuf_dirty_sou(struct drm_file *file_priv,
|
|||
int clip_y1 = clips_ptr->y1 - unit->crtc.y;
|
||||
int clip_x2 = clips_ptr->x2 - unit->crtc.x;
|
||||
int clip_y2 = clips_ptr->y2 - unit->crtc.y;
|
||||
int move_x, move_y;
|
||||
|
||||
/* skip any crtcs that misses the clip region */
|
||||
if (clip_x1 >= unit->crtc.mode.hdisplay ||
|
||||
|
@ -789,12 +870,21 @@ static int do_dmabuf_dirty_sou(struct drm_file *file_priv,
|
|||
clip_x2 <= 0 || clip_y2 <= 0)
|
||||
continue;
|
||||
|
||||
/* clip size to crtc size */
|
||||
clip_x2 = min_t(int, clip_x2, unit->crtc.mode.hdisplay);
|
||||
clip_y2 = min_t(int, clip_y2, unit->crtc.mode.vdisplay);
|
||||
|
||||
/* translate both src and dest to bring clip into screen */
|
||||
move_x = min_t(int, clip_x1, 0);
|
||||
move_y = min_t(int, clip_y1, 0);
|
||||
|
||||
/* actual translate done here */
|
||||
blits[hit_num].header = SVGA_CMD_BLIT_GMRFB_TO_SCREEN;
|
||||
blits[hit_num].body.destScreenId = unit->unit;
|
||||
blits[hit_num].body.srcOrigin.x = clips_ptr->x1;
|
||||
blits[hit_num].body.srcOrigin.y = clips_ptr->y1;
|
||||
blits[hit_num].body.destRect.left = clip_x1;
|
||||
blits[hit_num].body.destRect.top = clip_y1;
|
||||
blits[hit_num].body.srcOrigin.x = clips_ptr->x1 - move_x;
|
||||
blits[hit_num].body.srcOrigin.y = clips_ptr->y1 - move_y;
|
||||
blits[hit_num].body.destRect.left = clip_x1 - move_x;
|
||||
blits[hit_num].body.destRect.top = clip_y1 - move_y;
|
||||
blits[hit_num].body.destRect.right = clip_x2;
|
||||
blits[hit_num].body.destRect.bottom = clip_y2;
|
||||
hit_num++;
|
||||
|
@ -1003,7 +1093,6 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
|
|||
struct vmw_surface *surface = NULL;
|
||||
struct vmw_dma_buffer *bo = NULL;
|
||||
struct ttm_base_object *user_obj;
|
||||
u64 required_size;
|
||||
int ret;
|
||||
|
||||
/**
|
||||
|
@ -1012,8 +1101,9 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
|
|||
* requested framebuffer.
|
||||
*/
|
||||
|
||||
required_size = mode_cmd->pitch * mode_cmd->height;
|
||||
if (unlikely(required_size > (u64) dev_priv->vram_size)) {
|
||||
if (!vmw_kms_validate_mode_vram(dev_priv,
|
||||
mode_cmd->pitch,
|
||||
mode_cmd->height)) {
|
||||
DRM_ERROR("VRAM size is too small for requested mode.\n");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
@ -1033,46 +1123,29 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
|
|||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
/**
|
||||
* End conditioned code.
|
||||
*/
|
||||
|
||||
ret = vmw_user_surface_lookup_handle(dev_priv, tfile,
|
||||
mode_cmd->handle, &surface);
|
||||
/* returns either a dmabuf or surface */
|
||||
ret = vmw_user_lookup_handle(dev_priv, tfile,
|
||||
mode_cmd->handle,
|
||||
&surface, &bo);
|
||||
if (ret)
|
||||
goto try_dmabuf;
|
||||
goto err_out;
|
||||
|
||||
if (!surface->scanout)
|
||||
goto err_not_scanout;
|
||||
/* Create the new framebuffer depending one what we got back */
|
||||
if (bo)
|
||||
ret = vmw_kms_new_framebuffer_dmabuf(dev_priv, bo, &vfb,
|
||||
mode_cmd);
|
||||
else if (surface)
|
||||
ret = vmw_kms_new_framebuffer_surface(dev_priv, file_priv,
|
||||
surface, &vfb, mode_cmd);
|
||||
else
|
||||
BUG();
|
||||
|
||||
ret = vmw_kms_new_framebuffer_surface(dev_priv, file_priv, surface,
|
||||
&vfb, mode_cmd);
|
||||
|
||||
/* vmw_user_surface_lookup takes one ref so does new_fb */
|
||||
vmw_surface_unreference(&surface);
|
||||
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to create vmw_framebuffer: %i\n", ret);
|
||||
ttm_base_object_unref(&user_obj);
|
||||
return ERR_PTR(ret);
|
||||
} else
|
||||
vfb->user_obj = user_obj;
|
||||
return &vfb->base;
|
||||
|
||||
try_dmabuf:
|
||||
DRM_INFO("%s: trying buffer\n", __func__);
|
||||
|
||||
ret = vmw_user_dmabuf_lookup(tfile, mode_cmd->handle, &bo);
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to find buffer: %i\n", ret);
|
||||
return ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
ret = vmw_kms_new_framebuffer_dmabuf(dev_priv, bo, &vfb,
|
||||
mode_cmd);
|
||||
|
||||
/* vmw_user_dmabuf_lookup takes one ref so does new_fb */
|
||||
vmw_dmabuf_unreference(&bo);
|
||||
err_out:
|
||||
/* vmw_user_lookup_handle takes one ref so does new_fb */
|
||||
if (bo)
|
||||
vmw_dmabuf_unreference(&bo);
|
||||
if (surface)
|
||||
vmw_surface_unreference(&surface);
|
||||
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to create vmw_framebuffer: %i\n", ret);
|
||||
|
@ -1082,14 +1155,6 @@ try_dmabuf:
|
|||
vfb->user_obj = user_obj;
|
||||
|
||||
return &vfb->base;
|
||||
|
||||
err_not_scanout:
|
||||
DRM_ERROR("surface not marked as scanout\n");
|
||||
/* vmw_user_surface_lookup takes one ref */
|
||||
vmw_surface_unreference(&surface);
|
||||
ttm_base_object_unref(&user_obj);
|
||||
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
static struct drm_mode_config_funcs vmw_kms_funcs = {
|
||||
|
@ -1106,10 +1171,12 @@ int vmw_kms_present(struct vmw_private *dev_priv,
|
|||
uint32_t num_clips)
|
||||
{
|
||||
struct vmw_display_unit *units[VMWGFX_NUM_DISPLAY_UNITS];
|
||||
struct drm_clip_rect *tmp;
|
||||
struct drm_crtc *crtc;
|
||||
size_t fifo_size;
|
||||
int i, k, num_units;
|
||||
int ret = 0; /* silence warning */
|
||||
int left, right, top, bottom;
|
||||
|
||||
struct {
|
||||
SVGA3dCmdHeader header;
|
||||
|
@ -1127,60 +1194,95 @@ int vmw_kms_present(struct vmw_private *dev_priv,
|
|||
BUG_ON(surface == NULL);
|
||||
BUG_ON(!clips || !num_clips);
|
||||
|
||||
tmp = kzalloc(sizeof(*tmp) * num_clips, GFP_KERNEL);
|
||||
if (unlikely(tmp == NULL)) {
|
||||
DRM_ERROR("Temporary cliprect memory alloc failed.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num_clips;
|
||||
cmd = kmalloc(fifo_size, GFP_KERNEL);
|
||||
if (unlikely(cmd == NULL)) {
|
||||
DRM_ERROR("Failed to allocate temporary fifo memory.\n");
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto out_free_tmp;
|
||||
}
|
||||
|
||||
left = clips->x;
|
||||
right = clips->x + clips->w;
|
||||
top = clips->y;
|
||||
bottom = clips->y + clips->h;
|
||||
|
||||
for (i = 1; i < num_clips; i++) {
|
||||
left = min_t(int, left, (int)clips[i].x);
|
||||
right = max_t(int, right, (int)clips[i].x + clips[i].w);
|
||||
top = min_t(int, top, (int)clips[i].y);
|
||||
bottom = max_t(int, bottom, (int)clips[i].y + clips[i].h);
|
||||
}
|
||||
|
||||
/* only need to do this once */
|
||||
memset(cmd, 0, fifo_size);
|
||||
cmd->header.id = cpu_to_le32(SVGA_3D_CMD_BLIT_SURFACE_TO_SCREEN);
|
||||
cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header));
|
||||
|
||||
cmd->body.srcRect.left = 0;
|
||||
cmd->body.srcRect.right = surface->sizes[0].width;
|
||||
cmd->body.srcRect.top = 0;
|
||||
cmd->body.srcRect.bottom = surface->sizes[0].height;
|
||||
|
||||
blits = (SVGASignedRect *)&cmd[1];
|
||||
|
||||
cmd->body.srcRect.left = left;
|
||||
cmd->body.srcRect.right = right;
|
||||
cmd->body.srcRect.top = top;
|
||||
cmd->body.srcRect.bottom = bottom;
|
||||
|
||||
for (i = 0; i < num_clips; i++) {
|
||||
blits[i].left = clips[i].x;
|
||||
blits[i].right = clips[i].x + clips[i].w;
|
||||
blits[i].top = clips[i].y;
|
||||
blits[i].bottom = clips[i].y + clips[i].h;
|
||||
tmp[i].x1 = clips[i].x - left;
|
||||
tmp[i].x2 = clips[i].x + clips[i].w - left;
|
||||
tmp[i].y1 = clips[i].y - top;
|
||||
tmp[i].y2 = clips[i].y + clips[i].h - top;
|
||||
}
|
||||
|
||||
for (k = 0; k < num_units; k++) {
|
||||
struct vmw_display_unit *unit = units[k];
|
||||
int clip_x1 = destX - unit->crtc.x;
|
||||
int clip_y1 = destY - unit->crtc.y;
|
||||
int clip_x2 = clip_x1 + surface->sizes[0].width;
|
||||
int clip_y2 = clip_y1 + surface->sizes[0].height;
|
||||
struct vmw_clip_rect clip;
|
||||
int num;
|
||||
|
||||
clip.x1 = left + destX - unit->crtc.x;
|
||||
clip.y1 = top + destY - unit->crtc.y;
|
||||
clip.x2 = right + destX - unit->crtc.x;
|
||||
clip.y2 = bottom + destY - unit->crtc.y;
|
||||
|
||||
/* skip any crtcs that misses the clip region */
|
||||
if (clip_x1 >= unit->crtc.mode.hdisplay ||
|
||||
clip_y1 >= unit->crtc.mode.vdisplay ||
|
||||
clip_x2 <= 0 || clip_y2 <= 0)
|
||||
if (clip.x1 >= unit->crtc.mode.hdisplay ||
|
||||
clip.y1 >= unit->crtc.mode.vdisplay ||
|
||||
clip.x2 <= 0 || clip.y2 <= 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* In order for the clip rects to be correctly scaled
|
||||
* the src and dest rects needs to be the same size.
|
||||
*/
|
||||
cmd->body.destRect.left = clip.x1;
|
||||
cmd->body.destRect.right = clip.x2;
|
||||
cmd->body.destRect.top = clip.y1;
|
||||
cmd->body.destRect.bottom = clip.y2;
|
||||
|
||||
/* create a clip rect of the crtc in dest coords */
|
||||
clip.x2 = unit->crtc.mode.hdisplay - clip.x1;
|
||||
clip.y2 = unit->crtc.mode.vdisplay - clip.y1;
|
||||
clip.x1 = 0 - clip.x1;
|
||||
clip.y1 = 0 - clip.y1;
|
||||
|
||||
/* need to reset sid as it is changed by execbuf */
|
||||
cmd->body.srcImage.sid = sid;
|
||||
|
||||
cmd->body.destScreenId = unit->unit;
|
||||
|
||||
/*
|
||||
* The blit command is a lot more resilient then the
|
||||
* readback command when it comes to clip rects. So its
|
||||
* okay to go out of bounds.
|
||||
*/
|
||||
/* clip and write blits to cmd stream */
|
||||
vmw_clip_cliprects(tmp, num_clips, clip, blits, &num);
|
||||
|
||||
cmd->body.destRect.left = clip_x1;
|
||||
cmd->body.destRect.right = clip_x2;
|
||||
cmd->body.destRect.top = clip_y1;
|
||||
cmd->body.destRect.bottom = clip_y2;
|
||||
/* if no cliprects hit skip this */
|
||||
if (num == 0)
|
||||
continue;
|
||||
|
||||
/* recalculate package length */
|
||||
fifo_size = sizeof(*cmd) + sizeof(SVGASignedRect) * num;
|
||||
cmd->header.size = cpu_to_le32(fifo_size - sizeof(cmd->header));
|
||||
ret = vmw_execbuf_process(file_priv, dev_priv, NULL, cmd,
|
||||
fifo_size, 0, NULL);
|
||||
|
||||
|
@ -1189,6 +1291,8 @@ int vmw_kms_present(struct vmw_private *dev_priv,
|
|||
}
|
||||
|
||||
kfree(cmd);
|
||||
out_free_tmp:
|
||||
kfree(tmp);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -62,9 +62,14 @@ struct vmw_framebuffer {
|
|||
int vmw_cursor_update_image(struct vmw_private *dev_priv,
|
||||
u32 *image, u32 width, u32 height,
|
||||
u32 hotspotX, u32 hotspotY);
|
||||
int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv,
|
||||
struct vmw_dma_buffer *dmabuf,
|
||||
u32 width, u32 height,
|
||||
u32 hotspotX, u32 hotspotY);
|
||||
void vmw_cursor_update_position(struct vmw_private *dev_priv,
|
||||
bool show, int x, int y);
|
||||
|
||||
|
||||
/**
|
||||
* Base class display unit.
|
||||
*
|
||||
|
|
|
@ -74,9 +74,10 @@ static int vmw_ldu_commit_list(struct vmw_private *dev_priv)
|
|||
{
|
||||
struct vmw_legacy_display *lds = dev_priv->ldu_priv;
|
||||
struct vmw_legacy_display_unit *entry;
|
||||
struct vmw_display_unit *du = NULL;
|
||||
struct drm_framebuffer *fb = NULL;
|
||||
struct drm_crtc *crtc = NULL;
|
||||
int i = 0;
|
||||
int i = 0, ret;
|
||||
|
||||
/* If there is no display topology the host just assumes
|
||||
* that the guest will set the same layout as the host.
|
||||
|
@ -129,6 +130,25 @@ static int vmw_ldu_commit_list(struct vmw_private *dev_priv)
|
|||
|
||||
lds->last_num_active = lds->num_active;
|
||||
|
||||
|
||||
/* Find the first du with a cursor. */
|
||||
list_for_each_entry(entry, &lds->active, active) {
|
||||
du = &entry->base;
|
||||
|
||||
if (!du->cursor_dmabuf)
|
||||
continue;
|
||||
|
||||
ret = vmw_cursor_update_dmabuf(dev_priv,
|
||||
du->cursor_dmabuf,
|
||||
64, 64,
|
||||
du->hotspot_x,
|
||||
du->hotspot_y);
|
||||
if (ret == 0)
|
||||
break;
|
||||
|
||||
DRM_ERROR("Could not update cursor image\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1190,6 +1190,29 @@ void vmw_resource_unreserve(struct list_head *list)
|
|||
write_unlock(lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function that looks either a surface or dmabuf.
|
||||
*
|
||||
* The pointer this pointed at by out_surf and out_buf needs to be null.
|
||||
*/
|
||||
int vmw_user_lookup_handle(struct vmw_private *dev_priv,
|
||||
struct ttm_object_file *tfile,
|
||||
uint32_t handle,
|
||||
struct vmw_surface **out_surf,
|
||||
struct vmw_dma_buffer **out_buf)
|
||||
{
|
||||
int ret;
|
||||
|
||||
BUG_ON(*out_surf || *out_buf);
|
||||
|
||||
ret = vmw_user_surface_lookup_handle(dev_priv, tfile, handle, out_surf);
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
ret = vmw_user_dmabuf_lookup(tfile, handle, out_buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int vmw_user_surface_lookup_handle(struct vmw_private *dev_priv,
|
||||
struct ttm_object_file *tfile,
|
||||
|
|
|
@ -893,6 +893,13 @@ static int __devinit pch_i2c_probe(struct pci_dev *pdev,
|
|||
/* Set the number of I2C channel instance */
|
||||
adap_info->ch_num = id->driver_data;
|
||||
|
||||
ret = request_irq(pdev->irq, pch_i2c_handler, IRQF_SHARED,
|
||||
KBUILD_MODNAME, adap_info);
|
||||
if (ret) {
|
||||
pch_pci_err(pdev, "request_irq FAILED\n");
|
||||
goto err_request_irq;
|
||||
}
|
||||
|
||||
for (i = 0; i < adap_info->ch_num; i++) {
|
||||
pch_adap = &adap_info->pch_data[i].pch_adapter;
|
||||
adap_info->pch_i2c_suspended = false;
|
||||
|
@ -910,28 +917,23 @@ static int __devinit pch_i2c_probe(struct pci_dev *pdev,
|
|||
|
||||
pch_adap->dev.parent = &pdev->dev;
|
||||
|
||||
pch_i2c_init(&adap_info->pch_data[i]);
|
||||
ret = i2c_add_adapter(pch_adap);
|
||||
if (ret) {
|
||||
pch_pci_err(pdev, "i2c_add_adapter[ch:%d] FAILED\n", i);
|
||||
goto err_i2c_add_adapter;
|
||||
goto err_add_adapter;
|
||||
}
|
||||
|
||||
pch_i2c_init(&adap_info->pch_data[i]);
|
||||
}
|
||||
ret = request_irq(pdev->irq, pch_i2c_handler, IRQF_SHARED,
|
||||
KBUILD_MODNAME, adap_info);
|
||||
if (ret) {
|
||||
pch_pci_err(pdev, "request_irq FAILED\n");
|
||||
goto err_i2c_add_adapter;
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, adap_info);
|
||||
pch_pci_dbg(pdev, "returns %d.\n", ret);
|
||||
return 0;
|
||||
|
||||
err_i2c_add_adapter:
|
||||
err_add_adapter:
|
||||
for (j = 0; j < i; j++)
|
||||
i2c_del_adapter(&adap_info->pch_data[j].pch_adapter);
|
||||
free_irq(pdev->irq, adap_info);
|
||||
err_request_irq:
|
||||
pci_iounmap(pdev, base_addr);
|
||||
err_pci_iomap:
|
||||
pci_release_regions(pdev);
|
||||
|
|
|
@ -1047,13 +1047,14 @@ omap_i2c_probe(struct platform_device *pdev)
|
|||
* size. This is to ensure that we can handle the status on int
|
||||
* call back latencies.
|
||||
*/
|
||||
if (dev->rev >= OMAP_I2C_REV_ON_3530_4430) {
|
||||
dev->fifo_size = 0;
|
||||
|
||||
dev->fifo_size = (dev->fifo_size / 2);
|
||||
|
||||
if (dev->rev >= OMAP_I2C_REV_ON_3530_4430)
|
||||
dev->b_hw = 0; /* Disable hardware fixes */
|
||||
} else {
|
||||
dev->fifo_size = (dev->fifo_size / 2);
|
||||
else
|
||||
dev->b_hw = 1; /* Enable hardware fixes */
|
||||
}
|
||||
|
||||
/* calculate wakeup latency constraint for MPU */
|
||||
if (dev->set_mpu_wkup_lat != NULL)
|
||||
dev->latency = (1000000 * dev->fifo_size) /
|
||||
|
|
|
@ -534,6 +534,7 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c,
|
|||
|
||||
/* first, try busy waiting briefly */
|
||||
do {
|
||||
cpu_relax();
|
||||
iicstat = readl(i2c->regs + S3C2410_IICSTAT);
|
||||
} while ((iicstat & S3C2410_IICSTAT_START) && --spins);
|
||||
|
||||
|
@ -786,7 +787,7 @@ static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c)
|
|||
#else
|
||||
static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c)
|
||||
{
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c)
|
||||
|
|
|
@ -2513,6 +2513,9 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
|
|||
|
||||
req.private_data_len = sizeof(struct cma_hdr) +
|
||||
conn_param->private_data_len;
|
||||
if (req.private_data_len < conn_param->private_data_len)
|
||||
return -EINVAL;
|
||||
|
||||
req.private_data = kzalloc(req.private_data_len, GFP_ATOMIC);
|
||||
if (!req.private_data)
|
||||
return -ENOMEM;
|
||||
|
@ -2562,6 +2565,9 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
|
|||
memset(&req, 0, sizeof req);
|
||||
offset = cma_user_data_offset(id_priv->id.ps);
|
||||
req.private_data_len = offset + conn_param->private_data_len;
|
||||
if (req.private_data_len < conn_param->private_data_len)
|
||||
return -EINVAL;
|
||||
|
||||
private_data = kzalloc(req.private_data_len, GFP_ATOMIC);
|
||||
if (!private_data)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -1244,7 +1244,8 @@ err_reg:
|
|||
|
||||
err_counter:
|
||||
for (; i; --i)
|
||||
mlx4_counter_free(ibdev->dev, ibdev->counters[i - 1]);
|
||||
if (ibdev->counters[i - 1] != -1)
|
||||
mlx4_counter_free(ibdev->dev, ibdev->counters[i - 1]);
|
||||
|
||||
err_map:
|
||||
iounmap(ibdev->uar_map);
|
||||
|
@ -1275,7 +1276,8 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr)
|
|||
}
|
||||
iounmap(ibdev->uar_map);
|
||||
for (p = 0; p < ibdev->num_ports; ++p)
|
||||
mlx4_counter_free(ibdev->dev, ibdev->counters[p]);
|
||||
if (ibdev->counters[p] != -1)
|
||||
mlx4_counter_free(ibdev->dev, ibdev->counters[p]);
|
||||
mlx4_foreach_port(p, dev, MLX4_PORT_TYPE_IB)
|
||||
mlx4_CLOSE_PORT(dev, p);
|
||||
|
||||
|
|
|
@ -1285,7 +1285,7 @@ static int setup_ctxt(struct qib_pportdata *ppd, int ctxt,
|
|||
strlcpy(rcd->comm, current->comm, sizeof(rcd->comm));
|
||||
ctxt_fp(fp) = rcd;
|
||||
qib_stats.sps_ctxts++;
|
||||
dd->freectxts++;
|
||||
dd->freectxts--;
|
||||
ret = 0;
|
||||
goto bail;
|
||||
|
||||
|
@ -1794,7 +1794,7 @@ static int qib_close(struct inode *in, struct file *fp)
|
|||
if (dd->pageshadow)
|
||||
unlock_expected_tids(rcd);
|
||||
qib_stats.sps_ctxts--;
|
||||
dd->freectxts--;
|
||||
dd->freectxts++;
|
||||
}
|
||||
|
||||
mutex_unlock(&qib_mutex);
|
||||
|
|
|
@ -115,8 +115,8 @@ static void decode_mg(struct cma3000_accl_data *data, int *datax,
|
|||
static irqreturn_t cma3000_thread_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct cma3000_accl_data *data = dev_id;
|
||||
int datax, datay, dataz;
|
||||
u8 ctrl, mode, range, intr_status;
|
||||
int datax, datay, dataz, intr_status;
|
||||
u8 ctrl, mode, range;
|
||||
|
||||
intr_status = CMA3000_READ(data, CMA3000_INTSTATUS, "interrupt status");
|
||||
if (intr_status < 0)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Finger Sensing Pad PS/2 mouse driver.
|
||||
*
|
||||
* Copyright (C) 2005-2007 Asia Vital Components Co., Ltd.
|
||||
* Copyright (C) 2005-2010 Tai-hwa Liang, Sentelic Corporation.
|
||||
* Copyright (C) 2005-2011 Tai-hwa Liang, Sentelic Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -162,7 +162,7 @@ static int fsp_reg_write(struct psmouse *psmouse, int reg_addr, int reg_val)
|
|||
ps2_sendbyte(ps2dev, v, FSP_CMD_TIMEOUT2);
|
||||
|
||||
if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
|
||||
return -1;
|
||||
goto out;
|
||||
|
||||
if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) {
|
||||
/* inversion is required */
|
||||
|
@ -261,7 +261,7 @@ static int fsp_page_reg_write(struct psmouse *psmouse, int reg_val)
|
|||
ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2);
|
||||
|
||||
if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0)
|
||||
return -1;
|
||||
goto out;
|
||||
|
||||
if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) {
|
||||
ps2_sendbyte(ps2dev, 0x47, FSP_CMD_TIMEOUT2);
|
||||
|
@ -309,7 +309,7 @@ static int fsp_get_buttons(struct psmouse *psmouse, int *btn)
|
|||
};
|
||||
int val;
|
||||
|
||||
if (fsp_reg_read(psmouse, FSP_REG_TMOD_STATUS1, &val) == -1)
|
||||
if (fsp_reg_read(psmouse, FSP_REG_TMOD_STATUS, &val) == -1)
|
||||
return -EIO;
|
||||
|
||||
*btn = buttons[(val & 0x30) >> 4];
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Finger Sensing Pad PS/2 mouse driver.
|
||||
*
|
||||
* Copyright (C) 2005-2007 Asia Vital Components Co., Ltd.
|
||||
* Copyright (C) 2005-2009 Tai-hwa Liang, Sentelic Corporation.
|
||||
* Copyright (C) 2005-2011 Tai-hwa Liang, Sentelic Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -33,6 +33,7 @@
|
|||
/* Finger-sensing Pad control registers */
|
||||
#define FSP_REG_SYSCTL1 0x10
|
||||
#define FSP_BIT_EN_REG_CLK BIT(5)
|
||||
#define FSP_REG_TMOD_STATUS 0x20
|
||||
#define FSP_REG_OPC_QDOWN 0x31
|
||||
#define FSP_BIT_EN_OPC_TAG BIT(7)
|
||||
#define FSP_REG_OPTZ_XLO 0x34
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/input/mt.h>
|
||||
#include <linux/serio.h>
|
||||
|
@ -1220,6 +1221,16 @@ static int synaptics_reconnect(struct psmouse *psmouse)
|
|||
|
||||
do {
|
||||
psmouse_reset(psmouse);
|
||||
if (retry) {
|
||||
/*
|
||||
* On some boxes, right after resuming, the touchpad
|
||||
* needs some time to finish initializing (I assume
|
||||
* it needs time to calibrate) and start responding
|
||||
* to Synaptics-specific queries, so let's wait a
|
||||
* bit.
|
||||
*/
|
||||
ssleep(1);
|
||||
}
|
||||
error = synaptics_detect(psmouse, 0);
|
||||
} while (error && ++retry < 3);
|
||||
|
||||
|
|
|
@ -1470,6 +1470,9 @@ static const struct wacom_features wacom_features_0xE3 =
|
|||
static const struct wacom_features wacom_features_0xE6 =
|
||||
{ "Wacom ISDv4 E6", WACOM_PKGLEN_TPC2FG, 27760, 15694, 255,
|
||||
0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
static const struct wacom_features wacom_features_0xEC =
|
||||
{ "Wacom ISDv4 EC", WACOM_PKGLEN_GRAPHIRE, 25710, 14500, 255,
|
||||
0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
static const struct wacom_features wacom_features_0x47 =
|
||||
{ "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023,
|
||||
31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
|
@ -1611,6 +1614,7 @@ const struct usb_device_id wacom_ids[] = {
|
|||
{ USB_DEVICE_WACOM(0xE2) },
|
||||
{ USB_DEVICE_WACOM(0xE3) },
|
||||
{ USB_DEVICE_WACOM(0xE6) },
|
||||
{ USB_DEVICE_WACOM(0xEC) },
|
||||
{ USB_DEVICE_WACOM(0x47) },
|
||||
{ USB_DEVICE_LENOVO(0x6004) },
|
||||
{ }
|
||||
|
|
|
@ -90,7 +90,7 @@ struct iommu_domain *iommu_domain_alloc(struct bus_type *bus)
|
|||
if (bus == NULL || bus->iommu_ops == NULL)
|
||||
return NULL;
|
||||
|
||||
domain = kmalloc(sizeof(*domain), GFP_KERNEL);
|
||||
domain = kzalloc(sizeof(*domain), GFP_KERNEL);
|
||||
if (!domain)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -1393,9 +1393,6 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto
|
|||
atomic_read(&bitmap->behind_writes),
|
||||
bitmap->mddev->bitmap_info.max_write_behind);
|
||||
}
|
||||
if (bitmap->mddev->degraded)
|
||||
/* Never clear bits or update events_cleared when degraded */
|
||||
success = 0;
|
||||
|
||||
while (sectors) {
|
||||
sector_t blocks;
|
||||
|
@ -1409,7 +1406,7 @@ void bitmap_endwrite(struct bitmap *bitmap, sector_t offset, unsigned long secto
|
|||
return;
|
||||
}
|
||||
|
||||
if (success &&
|
||||
if (success && !bitmap->mddev->degraded &&
|
||||
bitmap->events_cleared < bitmap->mddev->events) {
|
||||
bitmap->events_cleared = bitmap->mddev->events;
|
||||
bitmap->need_sync = 1;
|
||||
|
|
|
@ -230,6 +230,7 @@ static int linear_add(struct mddev *mddev, struct md_rdev *rdev)
|
|||
return -EINVAL;
|
||||
|
||||
rdev->raid_disk = rdev->saved_raid_disk;
|
||||
rdev->saved_raid_disk = -1;
|
||||
|
||||
newconf = linear_conf(mddev,mddev->raid_disks+1);
|
||||
|
||||
|
|
|
@ -7360,8 +7360,7 @@ static int remove_and_add_spares(struct mddev *mddev)
|
|||
spares++;
|
||||
md_new_event(mddev);
|
||||
set_bit(MD_CHANGE_DEVS, &mddev->flags);
|
||||
} else
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3065,11 +3065,17 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
|
|||
}
|
||||
} else if (test_bit(In_sync, &rdev->flags))
|
||||
set_bit(R5_Insync, &dev->flags);
|
||||
else {
|
||||
else if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset)
|
||||
/* in sync if before recovery_offset */
|
||||
if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset)
|
||||
set_bit(R5_Insync, &dev->flags);
|
||||
}
|
||||
set_bit(R5_Insync, &dev->flags);
|
||||
else if (test_bit(R5_UPTODATE, &dev->flags) &&
|
||||
test_bit(R5_Expanded, &dev->flags))
|
||||
/* If we've reshaped into here, we assume it is Insync.
|
||||
* We will shortly update recovery_offset to make
|
||||
* it official.
|
||||
*/
|
||||
set_bit(R5_Insync, &dev->flags);
|
||||
|
||||
if (rdev && test_bit(R5_WriteError, &dev->flags)) {
|
||||
clear_bit(R5_Insync, &dev->flags);
|
||||
if (!test_bit(Faulty, &rdev->flags)) {
|
||||
|
|
|
@ -488,9 +488,10 @@ static int mxl5007t_write_regs(struct mxl5007t_state *state,
|
|||
|
||||
static int mxl5007t_read_reg(struct mxl5007t_state *state, u8 reg, u8 *val)
|
||||
{
|
||||
u8 buf[2] = { 0xfb, reg };
|
||||
struct i2c_msg msg[] = {
|
||||
{ .addr = state->i2c_props.addr, .flags = 0,
|
||||
.buf = ®, .len = 1 },
|
||||
.buf = buf, .len = 2 },
|
||||
{ .addr = state->i2c_props.addr, .flags = I2C_M_RD,
|
||||
.buf = val, .len = 1 },
|
||||
};
|
||||
|
|
|
@ -141,7 +141,7 @@ static int tda18218_set_params(struct dvb_frontend *fe,
|
|||
switch (params->u.ofdm.bandwidth) {
|
||||
case BANDWIDTH_6_MHZ:
|
||||
LP_Fc = 0;
|
||||
LO_Frac = params->frequency + 4000000;
|
||||
LO_Frac = params->frequency + 3000000;
|
||||
break;
|
||||
case BANDWIDTH_7_MHZ:
|
||||
LP_Fc = 1;
|
||||
|
|
|
@ -189,7 +189,7 @@ struct ati_remote {
|
|||
dma_addr_t inbuf_dma;
|
||||
dma_addr_t outbuf_dma;
|
||||
|
||||
unsigned char old_data[2]; /* Detect duplicate events */
|
||||
unsigned char old_data; /* Detect duplicate events */
|
||||
unsigned long old_jiffies;
|
||||
unsigned long acc_jiffies; /* handle acceleration */
|
||||
unsigned long first_jiffies;
|
||||
|
@ -221,35 +221,35 @@ struct ati_remote {
|
|||
/* Translation table from hardware messages to input events. */
|
||||
static const struct {
|
||||
short kind;
|
||||
unsigned char data1, data2;
|
||||
unsigned char data;
|
||||
int type;
|
||||
unsigned int code;
|
||||
int value;
|
||||
} ati_remote_tbl[] = {
|
||||
/* Directional control pad axes */
|
||||
{KIND_ACCEL, 0x35, 0x70, EV_REL, REL_X, -1}, /* left */
|
||||
{KIND_ACCEL, 0x36, 0x71, EV_REL, REL_X, 1}, /* right */
|
||||
{KIND_ACCEL, 0x37, 0x72, EV_REL, REL_Y, -1}, /* up */
|
||||
{KIND_ACCEL, 0x38, 0x73, EV_REL, REL_Y, 1}, /* down */
|
||||
{KIND_ACCEL, 0x70, EV_REL, REL_X, -1}, /* left */
|
||||
{KIND_ACCEL, 0x71, EV_REL, REL_X, 1}, /* right */
|
||||
{KIND_ACCEL, 0x72, EV_REL, REL_Y, -1}, /* up */
|
||||
{KIND_ACCEL, 0x73, EV_REL, REL_Y, 1}, /* down */
|
||||
/* Directional control pad diagonals */
|
||||
{KIND_LU, 0x39, 0x74, EV_REL, 0, 0}, /* left up */
|
||||
{KIND_RU, 0x3a, 0x75, EV_REL, 0, 0}, /* right up */
|
||||
{KIND_LD, 0x3c, 0x77, EV_REL, 0, 0}, /* left down */
|
||||
{KIND_RD, 0x3b, 0x76, EV_REL, 0, 0}, /* right down */
|
||||
{KIND_LU, 0x74, EV_REL, 0, 0}, /* left up */
|
||||
{KIND_RU, 0x75, EV_REL, 0, 0}, /* right up */
|
||||
{KIND_LD, 0x77, EV_REL, 0, 0}, /* left down */
|
||||
{KIND_RD, 0x76, EV_REL, 0, 0}, /* right down */
|
||||
|
||||
/* "Mouse button" buttons */
|
||||
{KIND_LITERAL, 0x3d, 0x78, EV_KEY, BTN_LEFT, 1}, /* left btn down */
|
||||
{KIND_LITERAL, 0x3e, 0x79, EV_KEY, BTN_LEFT, 0}, /* left btn up */
|
||||
{KIND_LITERAL, 0x41, 0x7c, EV_KEY, BTN_RIGHT, 1},/* right btn down */
|
||||
{KIND_LITERAL, 0x42, 0x7d, EV_KEY, BTN_RIGHT, 0},/* right btn up */
|
||||
{KIND_LITERAL, 0x78, EV_KEY, BTN_LEFT, 1}, /* left btn down */
|
||||
{KIND_LITERAL, 0x79, EV_KEY, BTN_LEFT, 0}, /* left btn up */
|
||||
{KIND_LITERAL, 0x7c, EV_KEY, BTN_RIGHT, 1},/* right btn down */
|
||||
{KIND_LITERAL, 0x7d, EV_KEY, BTN_RIGHT, 0},/* right btn up */
|
||||
|
||||
/* Artificial "doubleclick" events are generated by the hardware.
|
||||
* They are mapped to the "side" and "extra" mouse buttons here. */
|
||||
{KIND_FILTERED, 0x3f, 0x7a, EV_KEY, BTN_SIDE, 1}, /* left dblclick */
|
||||
{KIND_FILTERED, 0x43, 0x7e, EV_KEY, BTN_EXTRA, 1},/* right dblclick */
|
||||
{KIND_FILTERED, 0x7a, EV_KEY, BTN_SIDE, 1}, /* left dblclick */
|
||||
{KIND_FILTERED, 0x7e, EV_KEY, BTN_EXTRA, 1},/* right dblclick */
|
||||
|
||||
/* Non-mouse events are handled by rc-core */
|
||||
{KIND_END, 0x00, 0x00, EV_MAX + 1, 0, 0}
|
||||
{KIND_END, 0x00, EV_MAX + 1, 0, 0}
|
||||
};
|
||||
|
||||
/* Local function prototypes */
|
||||
|
@ -396,25 +396,6 @@ static int ati_remote_sendpacket(struct ati_remote *ati_remote, u16 cmd, unsigne
|
|||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* ati_remote_event_lookup
|
||||
*/
|
||||
static int ati_remote_event_lookup(int rem, unsigned char d1, unsigned char d2)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) {
|
||||
/*
|
||||
* Decide if the table entry matches the remote input.
|
||||
*/
|
||||
if (ati_remote_tbl[i].data1 == d1 &&
|
||||
ati_remote_tbl[i].data2 == d2)
|
||||
return i;
|
||||
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* ati_remote_compute_accel
|
||||
*
|
||||
|
@ -463,7 +444,15 @@ static void ati_remote_input_report(struct urb *urb)
|
|||
int index = -1;
|
||||
int acc;
|
||||
int remote_num;
|
||||
unsigned char scancode[2];
|
||||
unsigned char scancode;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* data[0] = 0x14
|
||||
* data[1] = data[2] + data[3] + 0xd5 (a checksum byte)
|
||||
* data[2] = the key code (with toggle bit in MSB with some models)
|
||||
* data[3] = channel << 4 (the low 4 bits must be zero)
|
||||
*/
|
||||
|
||||
/* Deal with strange looking inputs */
|
||||
if ( (urb->actual_length != 4) || (data[0] != 0x14) ||
|
||||
|
@ -472,6 +461,13 @@ static void ati_remote_input_report(struct urb *urb)
|
|||
return;
|
||||
}
|
||||
|
||||
if (data[1] != ((data[2] + data[3] + 0xd5) & 0xff)) {
|
||||
dbginfo(&ati_remote->interface->dev,
|
||||
"wrong checksum in input: %02x %02x %02x %02x\n",
|
||||
data[0], data[1], data[2], data[3]);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Mask unwanted remote channels. */
|
||||
/* note: remote_num is 0-based, channel 1 on remote == 0 here */
|
||||
remote_num = (data[3] >> 4) & 0x0f;
|
||||
|
@ -482,31 +478,30 @@ static void ati_remote_input_report(struct urb *urb)
|
|||
return;
|
||||
}
|
||||
|
||||
scancode[0] = (((data[1] - ((remote_num + 1) << 4)) & 0xf0) | (data[1] & 0x0f));
|
||||
|
||||
/*
|
||||
* Some devices (e.g. SnapStream Firefly) use 8080 as toggle code,
|
||||
* so we have to clear them. The first bit is a bit tricky as the
|
||||
* "non-toggled" state depends on remote_num, so we xor it with the
|
||||
* second bit which is only used for toggle.
|
||||
* MSB is a toggle code, though only used by some devices
|
||||
* (e.g. SnapStream Firefly)
|
||||
*/
|
||||
scancode[0] ^= (data[2] & 0x80);
|
||||
scancode = data[2] & 0x7f;
|
||||
|
||||
scancode[1] = data[2] & ~0x80;
|
||||
|
||||
/* Look up event code index in mouse translation table. */
|
||||
index = ati_remote_event_lookup(remote_num, scancode[0], scancode[1]);
|
||||
/* Look up event code index in the mouse translation table. */
|
||||
for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) {
|
||||
if (scancode == ati_remote_tbl[i].data) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (index >= 0) {
|
||||
dbginfo(&ati_remote->interface->dev,
|
||||
"channel 0x%02x; mouse data %02x,%02x; index %d; keycode %d\n",
|
||||
remote_num, data[1], data[2], index, ati_remote_tbl[index].code);
|
||||
"channel 0x%02x; mouse data %02x; index %d; keycode %d\n",
|
||||
remote_num, data[2], index, ati_remote_tbl[index].code);
|
||||
if (!dev)
|
||||
return; /* no mouse device */
|
||||
} else
|
||||
dbginfo(&ati_remote->interface->dev,
|
||||
"channel 0x%02x; key data %02x,%02x, scancode %02x,%02x\n",
|
||||
remote_num, data[1], data[2], scancode[0], scancode[1]);
|
||||
"channel 0x%02x; key data %02x, scancode %02x\n",
|
||||
remote_num, data[2], scancode);
|
||||
|
||||
|
||||
if (index >= 0 && ati_remote_tbl[index].kind == KIND_LITERAL) {
|
||||
|
@ -523,8 +518,7 @@ static void ati_remote_input_report(struct urb *urb)
|
|||
unsigned long now = jiffies;
|
||||
|
||||
/* Filter duplicate events which happen "too close" together. */
|
||||
if (ati_remote->old_data[0] == data[1] &&
|
||||
ati_remote->old_data[1] == data[2] &&
|
||||
if (ati_remote->old_data == data[2] &&
|
||||
time_before(now, ati_remote->old_jiffies +
|
||||
msecs_to_jiffies(repeat_filter))) {
|
||||
ati_remote->repeat_count++;
|
||||
|
@ -533,8 +527,7 @@ static void ati_remote_input_report(struct urb *urb)
|
|||
ati_remote->first_jiffies = now;
|
||||
}
|
||||
|
||||
ati_remote->old_data[0] = data[1];
|
||||
ati_remote->old_data[1] = data[2];
|
||||
ati_remote->old_data = data[2];
|
||||
ati_remote->old_jiffies = now;
|
||||
|
||||
/* Ensure we skip at least the 4 first duplicate events (generated
|
||||
|
@ -549,14 +542,13 @@ static void ati_remote_input_report(struct urb *urb)
|
|||
|
||||
if (index < 0) {
|
||||
/* Not a mouse event, hand it to rc-core. */
|
||||
u32 rc_code = (scancode[0] << 8) | scancode[1];
|
||||
|
||||
/*
|
||||
* We don't use the rc-core repeat handling yet as
|
||||
* it would cause ghost repeats which would be a
|
||||
* regression for this driver.
|
||||
*/
|
||||
rc_keydown_notimeout(ati_remote->rdev, rc_code,
|
||||
rc_keydown_notimeout(ati_remote->rdev, scancode,
|
||||
data[2]);
|
||||
rc_keyup(ati_remote->rdev);
|
||||
return;
|
||||
|
@ -607,8 +599,7 @@ static void ati_remote_input_report(struct urb *urb)
|
|||
input_sync(dev);
|
||||
|
||||
ati_remote->old_jiffies = jiffies;
|
||||
ati_remote->old_data[0] = data[1];
|
||||
ati_remote->old_data[1] = data[2];
|
||||
ati_remote->old_data = data[2];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -27,55 +27,55 @@
|
|||
#include <media/rc-map.h>
|
||||
|
||||
static struct rc_map_table ati_x10[] = {
|
||||
{ 0xd20d, KEY_1 },
|
||||
{ 0xd30e, KEY_2 },
|
||||
{ 0xd40f, KEY_3 },
|
||||
{ 0xd510, KEY_4 },
|
||||
{ 0xd611, KEY_5 },
|
||||
{ 0xd712, KEY_6 },
|
||||
{ 0xd813, KEY_7 },
|
||||
{ 0xd914, KEY_8 },
|
||||
{ 0xda15, KEY_9 },
|
||||
{ 0xdc17, KEY_0 },
|
||||
{ 0xc500, KEY_A },
|
||||
{ 0xc601, KEY_B },
|
||||
{ 0xde19, KEY_C },
|
||||
{ 0xe01b, KEY_D },
|
||||
{ 0xe621, KEY_E },
|
||||
{ 0xe823, KEY_F },
|
||||
{ 0x0d, KEY_1 },
|
||||
{ 0x0e, KEY_2 },
|
||||
{ 0x0f, KEY_3 },
|
||||
{ 0x10, KEY_4 },
|
||||
{ 0x11, KEY_5 },
|
||||
{ 0x12, KEY_6 },
|
||||
{ 0x13, KEY_7 },
|
||||
{ 0x14, KEY_8 },
|
||||
{ 0x15, KEY_9 },
|
||||
{ 0x17, KEY_0 },
|
||||
{ 0x00, KEY_A },
|
||||
{ 0x01, KEY_B },
|
||||
{ 0x19, KEY_C },
|
||||
{ 0x1b, KEY_D },
|
||||
{ 0x21, KEY_E },
|
||||
{ 0x23, KEY_F },
|
||||
|
||||
{ 0xdd18, KEY_KPENTER }, /* "check" */
|
||||
{ 0xdb16, KEY_MENU }, /* "menu" */
|
||||
{ 0xc702, KEY_POWER }, /* Power */
|
||||
{ 0xc803, KEY_TV }, /* TV */
|
||||
{ 0xc904, KEY_DVD }, /* DVD */
|
||||
{ 0xca05, KEY_WWW }, /* WEB */
|
||||
{ 0xcb06, KEY_BOOKMARKS }, /* "book" */
|
||||
{ 0xcc07, KEY_EDIT }, /* "hand" */
|
||||
{ 0xe11c, KEY_COFFEE }, /* "timer" */
|
||||
{ 0xe520, KEY_FRONT }, /* "max" */
|
||||
{ 0xe21d, KEY_LEFT }, /* left */
|
||||
{ 0xe41f, KEY_RIGHT }, /* right */
|
||||
{ 0xe722, KEY_DOWN }, /* down */
|
||||
{ 0xdf1a, KEY_UP }, /* up */
|
||||
{ 0xe31e, KEY_OK }, /* "OK" */
|
||||
{ 0xce09, KEY_VOLUMEDOWN }, /* VOL + */
|
||||
{ 0xcd08, KEY_VOLUMEUP }, /* VOL - */
|
||||
{ 0xcf0a, KEY_MUTE }, /* MUTE */
|
||||
{ 0xd00b, KEY_CHANNELUP }, /* CH + */
|
||||
{ 0xd10c, KEY_CHANNELDOWN },/* CH - */
|
||||
{ 0xec27, KEY_RECORD }, /* ( o) red */
|
||||
{ 0xea25, KEY_PLAY }, /* ( >) */
|
||||
{ 0xe924, KEY_REWIND }, /* (<<) */
|
||||
{ 0xeb26, KEY_FORWARD }, /* (>>) */
|
||||
{ 0xed28, KEY_STOP }, /* ([]) */
|
||||
{ 0xee29, KEY_PAUSE }, /* ('') */
|
||||
{ 0xf02b, KEY_PREVIOUS }, /* (<-) */
|
||||
{ 0xef2a, KEY_NEXT }, /* (>+) */
|
||||
{ 0xf22d, KEY_INFO }, /* PLAYING */
|
||||
{ 0xf32e, KEY_HOME }, /* TOP */
|
||||
{ 0xf42f, KEY_END }, /* END */
|
||||
{ 0xf530, KEY_SELECT }, /* SELECT */
|
||||
{ 0x18, KEY_KPENTER }, /* "check" */
|
||||
{ 0x16, KEY_MENU }, /* "menu" */
|
||||
{ 0x02, KEY_POWER }, /* Power */
|
||||
{ 0x03, KEY_TV }, /* TV */
|
||||
{ 0x04, KEY_DVD }, /* DVD */
|
||||
{ 0x05, KEY_WWW }, /* WEB */
|
||||
{ 0x06, KEY_BOOKMARKS }, /* "book" */
|
||||
{ 0x07, KEY_EDIT }, /* "hand" */
|
||||
{ 0x1c, KEY_COFFEE }, /* "timer" */
|
||||
{ 0x20, KEY_FRONT }, /* "max" */
|
||||
{ 0x1d, KEY_LEFT }, /* left */
|
||||
{ 0x1f, KEY_RIGHT }, /* right */
|
||||
{ 0x22, KEY_DOWN }, /* down */
|
||||
{ 0x1a, KEY_UP }, /* up */
|
||||
{ 0x1e, KEY_OK }, /* "OK" */
|
||||
{ 0x09, KEY_VOLUMEDOWN }, /* VOL + */
|
||||
{ 0x08, KEY_VOLUMEUP }, /* VOL - */
|
||||
{ 0x0a, KEY_MUTE }, /* MUTE */
|
||||
{ 0x0b, KEY_CHANNELUP }, /* CH + */
|
||||
{ 0x0c, KEY_CHANNELDOWN },/* CH - */
|
||||
{ 0x27, KEY_RECORD }, /* ( o) red */
|
||||
{ 0x25, KEY_PLAY }, /* ( >) */
|
||||
{ 0x24, KEY_REWIND }, /* (<<) */
|
||||
{ 0x26, KEY_FORWARD }, /* (>>) */
|
||||
{ 0x28, KEY_STOP }, /* ([]) */
|
||||
{ 0x29, KEY_PAUSE }, /* ('') */
|
||||
{ 0x2b, KEY_PREVIOUS }, /* (<-) */
|
||||
{ 0x2a, KEY_NEXT }, /* (>+) */
|
||||
{ 0x2d, KEY_INFO }, /* PLAYING */
|
||||
{ 0x2e, KEY_HOME }, /* TOP */
|
||||
{ 0x2f, KEY_END }, /* END */
|
||||
{ 0x30, KEY_SELECT }, /* SELECT */
|
||||
};
|
||||
|
||||
static struct rc_map_list ati_x10_map = {
|
||||
|
|
|
@ -25,70 +25,70 @@
|
|||
#include <media/rc-map.h>
|
||||
|
||||
static struct rc_map_table medion_x10[] = {
|
||||
{ 0xf12c, KEY_TV }, /* TV */
|
||||
{ 0xf22d, KEY_VCR }, /* VCR */
|
||||
{ 0xc904, KEY_DVD }, /* DVD */
|
||||
{ 0xcb06, KEY_AUDIO }, /* MUSIC */
|
||||
{ 0x2c, KEY_TV }, /* TV */
|
||||
{ 0x2d, KEY_VCR }, /* VCR */
|
||||
{ 0x04, KEY_DVD }, /* DVD */
|
||||
{ 0x06, KEY_AUDIO }, /* MUSIC */
|
||||
|
||||
{ 0xf32e, KEY_RADIO }, /* RADIO */
|
||||
{ 0xca05, KEY_DIRECTORY }, /* PHOTO */
|
||||
{ 0xf42f, KEY_INFO }, /* TV-PREVIEW */
|
||||
{ 0xf530, KEY_LIST }, /* CHANNEL-LST */
|
||||
{ 0x2e, KEY_RADIO }, /* RADIO */
|
||||
{ 0x05, KEY_DIRECTORY }, /* PHOTO */
|
||||
{ 0x2f, KEY_INFO }, /* TV-PREVIEW */
|
||||
{ 0x30, KEY_LIST }, /* CHANNEL-LST */
|
||||
|
||||
{ 0xe01b, KEY_SETUP }, /* SETUP */
|
||||
{ 0xf631, KEY_VIDEO }, /* VIDEO DESKTOP */
|
||||
{ 0x1b, KEY_SETUP }, /* SETUP */
|
||||
{ 0x31, KEY_VIDEO }, /* VIDEO DESKTOP */
|
||||
|
||||
{ 0xcd08, KEY_VOLUMEDOWN }, /* VOL - */
|
||||
{ 0xce09, KEY_VOLUMEUP }, /* VOL + */
|
||||
{ 0xd00b, KEY_CHANNELUP }, /* CHAN + */
|
||||
{ 0xd10c, KEY_CHANNELDOWN }, /* CHAN - */
|
||||
{ 0xc500, KEY_MUTE }, /* MUTE */
|
||||
{ 0x08, KEY_VOLUMEDOWN }, /* VOL - */
|
||||
{ 0x09, KEY_VOLUMEUP }, /* VOL + */
|
||||
{ 0x0b, KEY_CHANNELUP }, /* CHAN + */
|
||||
{ 0x0c, KEY_CHANNELDOWN }, /* CHAN - */
|
||||
{ 0x00, KEY_MUTE }, /* MUTE */
|
||||
|
||||
{ 0xf732, KEY_RED }, /* red */
|
||||
{ 0xf833, KEY_GREEN }, /* green */
|
||||
{ 0xf934, KEY_YELLOW }, /* yellow */
|
||||
{ 0xfa35, KEY_BLUE }, /* blue */
|
||||
{ 0xdb16, KEY_TEXT }, /* TXT */
|
||||
{ 0x32, KEY_RED }, /* red */
|
||||
{ 0x33, KEY_GREEN }, /* green */
|
||||
{ 0x34, KEY_YELLOW }, /* yellow */
|
||||
{ 0x35, KEY_BLUE }, /* blue */
|
||||
{ 0x16, KEY_TEXT }, /* TXT */
|
||||
|
||||
{ 0xd20d, KEY_1 },
|
||||
{ 0xd30e, KEY_2 },
|
||||
{ 0xd40f, KEY_3 },
|
||||
{ 0xd510, KEY_4 },
|
||||
{ 0xd611, KEY_5 },
|
||||
{ 0xd712, KEY_6 },
|
||||
{ 0xd813, KEY_7 },
|
||||
{ 0xd914, KEY_8 },
|
||||
{ 0xda15, KEY_9 },
|
||||
{ 0xdc17, KEY_0 },
|
||||
{ 0xe11c, KEY_SEARCH }, /* TV/RAD, CH SRC */
|
||||
{ 0xe520, KEY_DELETE }, /* DELETE */
|
||||
{ 0x0d, KEY_1 },
|
||||
{ 0x0e, KEY_2 },
|
||||
{ 0x0f, KEY_3 },
|
||||
{ 0x10, KEY_4 },
|
||||
{ 0x11, KEY_5 },
|
||||
{ 0x12, KEY_6 },
|
||||
{ 0x13, KEY_7 },
|
||||
{ 0x14, KEY_8 },
|
||||
{ 0x15, KEY_9 },
|
||||
{ 0x17, KEY_0 },
|
||||
{ 0x1c, KEY_SEARCH }, /* TV/RAD, CH SRC */
|
||||
{ 0x20, KEY_DELETE }, /* DELETE */
|
||||
|
||||
{ 0xfb36, KEY_KEYBOARD }, /* RENAME */
|
||||
{ 0xdd18, KEY_SCREEN }, /* SNAPSHOT */
|
||||
{ 0x36, KEY_KEYBOARD }, /* RENAME */
|
||||
{ 0x18, KEY_SCREEN }, /* SNAPSHOT */
|
||||
|
||||
{ 0xdf1a, KEY_UP }, /* up */
|
||||
{ 0xe722, KEY_DOWN }, /* down */
|
||||
{ 0xe21d, KEY_LEFT }, /* left */
|
||||
{ 0xe41f, KEY_RIGHT }, /* right */
|
||||
{ 0xe31e, KEY_OK }, /* OK */
|
||||
{ 0x1a, KEY_UP }, /* up */
|
||||
{ 0x22, KEY_DOWN }, /* down */
|
||||
{ 0x1d, KEY_LEFT }, /* left */
|
||||
{ 0x1f, KEY_RIGHT }, /* right */
|
||||
{ 0x1e, KEY_OK }, /* OK */
|
||||
|
||||
{ 0xfc37, KEY_SELECT }, /* ACQUIRE IMAGE */
|
||||
{ 0xfd38, KEY_EDIT }, /* EDIT IMAGE */
|
||||
{ 0x37, KEY_SELECT }, /* ACQUIRE IMAGE */
|
||||
{ 0x38, KEY_EDIT }, /* EDIT IMAGE */
|
||||
|
||||
{ 0xe924, KEY_REWIND }, /* rewind (<<) */
|
||||
{ 0xea25, KEY_PLAY }, /* play ( >) */
|
||||
{ 0xeb26, KEY_FORWARD }, /* forward (>>) */
|
||||
{ 0xec27, KEY_RECORD }, /* record ( o) */
|
||||
{ 0xed28, KEY_STOP }, /* stop ([]) */
|
||||
{ 0xee29, KEY_PAUSE }, /* pause ('') */
|
||||
{ 0x24, KEY_REWIND }, /* rewind (<<) */
|
||||
{ 0x25, KEY_PLAY }, /* play ( >) */
|
||||
{ 0x26, KEY_FORWARD }, /* forward (>>) */
|
||||
{ 0x27, KEY_RECORD }, /* record ( o) */
|
||||
{ 0x28, KEY_STOP }, /* stop ([]) */
|
||||
{ 0x29, KEY_PAUSE }, /* pause ('') */
|
||||
|
||||
{ 0xe621, KEY_PREVIOUS }, /* prev */
|
||||
{ 0xfe39, KEY_SWITCHVIDEOMODE }, /* F SCR */
|
||||
{ 0xe823, KEY_NEXT }, /* next */
|
||||
{ 0xde19, KEY_MENU }, /* MENU */
|
||||
{ 0xff3a, KEY_LANGUAGE }, /* AUDIO */
|
||||
{ 0x21, KEY_PREVIOUS }, /* prev */
|
||||
{ 0x39, KEY_SWITCHVIDEOMODE }, /* F SCR */
|
||||
{ 0x23, KEY_NEXT }, /* next */
|
||||
{ 0x19, KEY_MENU }, /* MENU */
|
||||
{ 0x3a, KEY_LANGUAGE }, /* AUDIO */
|
||||
|
||||
{ 0xc702, KEY_POWER }, /* POWER */
|
||||
{ 0x02, KEY_POWER }, /* POWER */
|
||||
};
|
||||
|
||||
static struct rc_map_list medion_x10_map = {
|
||||
|
|
|
@ -22,63 +22,63 @@
|
|||
#include <media/rc-map.h>
|
||||
|
||||
static struct rc_map_table snapstream_firefly[] = {
|
||||
{ 0xf12c, KEY_ZOOM }, /* Maximize */
|
||||
{ 0xc702, KEY_CLOSE },
|
||||
{ 0x2c, KEY_ZOOM }, /* Maximize */
|
||||
{ 0x02, KEY_CLOSE },
|
||||
|
||||
{ 0xd20d, KEY_1 },
|
||||
{ 0xd30e, KEY_2 },
|
||||
{ 0xd40f, KEY_3 },
|
||||
{ 0xd510, KEY_4 },
|
||||
{ 0xd611, KEY_5 },
|
||||
{ 0xd712, KEY_6 },
|
||||
{ 0xd813, KEY_7 },
|
||||
{ 0xd914, KEY_8 },
|
||||
{ 0xda15, KEY_9 },
|
||||
{ 0xdc17, KEY_0 },
|
||||
{ 0xdb16, KEY_BACK },
|
||||
{ 0xdd18, KEY_KPENTER }, /* ent */
|
||||
{ 0x0d, KEY_1 },
|
||||
{ 0x0e, KEY_2 },
|
||||
{ 0x0f, KEY_3 },
|
||||
{ 0x10, KEY_4 },
|
||||
{ 0x11, KEY_5 },
|
||||
{ 0x12, KEY_6 },
|
||||
{ 0x13, KEY_7 },
|
||||
{ 0x14, KEY_8 },
|
||||
{ 0x15, KEY_9 },
|
||||
{ 0x17, KEY_0 },
|
||||
{ 0x16, KEY_BACK },
|
||||
{ 0x18, KEY_KPENTER }, /* ent */
|
||||
|
||||
{ 0xce09, KEY_VOLUMEUP },
|
||||
{ 0xcd08, KEY_VOLUMEDOWN },
|
||||
{ 0xcf0a, KEY_MUTE },
|
||||
{ 0xd00b, KEY_CHANNELUP },
|
||||
{ 0xd10c, KEY_CHANNELDOWN },
|
||||
{ 0xc500, KEY_VENDOR }, /* firefly */
|
||||
{ 0x09, KEY_VOLUMEUP },
|
||||
{ 0x08, KEY_VOLUMEDOWN },
|
||||
{ 0x0a, KEY_MUTE },
|
||||
{ 0x0b, KEY_CHANNELUP },
|
||||
{ 0x0c, KEY_CHANNELDOWN },
|
||||
{ 0x00, KEY_VENDOR }, /* firefly */
|
||||
|
||||
{ 0xf32e, KEY_INFO },
|
||||
{ 0xf42f, KEY_OPTION },
|
||||
{ 0x2e, KEY_INFO },
|
||||
{ 0x2f, KEY_OPTION },
|
||||
|
||||
{ 0xe21d, KEY_LEFT },
|
||||
{ 0xe41f, KEY_RIGHT },
|
||||
{ 0xe722, KEY_DOWN },
|
||||
{ 0xdf1a, KEY_UP },
|
||||
{ 0xe31e, KEY_OK },
|
||||
{ 0x1d, KEY_LEFT },
|
||||
{ 0x1f, KEY_RIGHT },
|
||||
{ 0x22, KEY_DOWN },
|
||||
{ 0x1a, KEY_UP },
|
||||
{ 0x1e, KEY_OK },
|
||||
|
||||
{ 0xe11c, KEY_MENU },
|
||||
{ 0xe520, KEY_EXIT },
|
||||
{ 0x1c, KEY_MENU },
|
||||
{ 0x20, KEY_EXIT },
|
||||
|
||||
{ 0xec27, KEY_RECORD },
|
||||
{ 0xea25, KEY_PLAY },
|
||||
{ 0xed28, KEY_STOP },
|
||||
{ 0xe924, KEY_REWIND },
|
||||
{ 0xeb26, KEY_FORWARD },
|
||||
{ 0xee29, KEY_PAUSE },
|
||||
{ 0xf02b, KEY_PREVIOUS },
|
||||
{ 0xef2a, KEY_NEXT },
|
||||
{ 0x27, KEY_RECORD },
|
||||
{ 0x25, KEY_PLAY },
|
||||
{ 0x28, KEY_STOP },
|
||||
{ 0x24, KEY_REWIND },
|
||||
{ 0x26, KEY_FORWARD },
|
||||
{ 0x29, KEY_PAUSE },
|
||||
{ 0x2b, KEY_PREVIOUS },
|
||||
{ 0x2a, KEY_NEXT },
|
||||
|
||||
{ 0xcb06, KEY_AUDIO }, /* Music */
|
||||
{ 0xca05, KEY_IMAGES }, /* Photos */
|
||||
{ 0xc904, KEY_DVD },
|
||||
{ 0xc803, KEY_TV },
|
||||
{ 0xcc07, KEY_VIDEO },
|
||||
{ 0x06, KEY_AUDIO }, /* Music */
|
||||
{ 0x05, KEY_IMAGES }, /* Photos */
|
||||
{ 0x04, KEY_DVD },
|
||||
{ 0x03, KEY_TV },
|
||||
{ 0x07, KEY_VIDEO },
|
||||
|
||||
{ 0xc601, KEY_HELP },
|
||||
{ 0xf22d, KEY_MODE }, /* Mouse */
|
||||
{ 0x01, KEY_HELP },
|
||||
{ 0x2d, KEY_MODE }, /* Mouse */
|
||||
|
||||
{ 0xde19, KEY_A },
|
||||
{ 0xe01b, KEY_B },
|
||||
{ 0xe621, KEY_C },
|
||||
{ 0xe823, KEY_D },
|
||||
{ 0x19, KEY_A },
|
||||
{ 0x1b, KEY_B },
|
||||
{ 0x21, KEY_C },
|
||||
{ 0x23, KEY_D },
|
||||
};
|
||||
|
||||
static struct rc_map_list snapstream_firefly_map = {
|
||||
|
|
|
@ -162,11 +162,14 @@ static void hauppauge_eeprom(struct au0828_dev *dev, u8 *eeprom_data)
|
|||
switch (tv.model) {
|
||||
case 72000: /* WinTV-HVR950q (Retail, IR, ATSC/QAM */
|
||||
case 72001: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and analog video */
|
||||
case 72101: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and analog video */
|
||||
case 72201: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */
|
||||
case 72211: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */
|
||||
case 72221: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */
|
||||
case 72231: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */
|
||||
case 72241: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM and analog video */
|
||||
case 72251: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and analog video */
|
||||
case 72261: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and analog video */
|
||||
case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and analog video */
|
||||
case 72500: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM */
|
||||
break;
|
||||
|
@ -324,6 +327,10 @@ struct usb_device_id au0828_usb_id_table[] = {
|
|||
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q_MXL },
|
||||
{ USB_DEVICE(0x2040, 0x8200),
|
||||
.driver_info = AU0828_BOARD_HAUPPAUGE_WOODBURY },
|
||||
{ USB_DEVICE(0x2040, 0x7260),
|
||||
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
|
||||
{ USB_DEVICE(0x2040, 0x7213),
|
||||
.driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
|
||||
{ },
|
||||
};
|
||||
|
||||
|
|
|
@ -838,13 +838,13 @@ static int gspca_init_transfer(struct gspca_dev *gspca_dev)
|
|||
gspca_dev->usb_err = 0;
|
||||
|
||||
/* do the specific subdriver stuff before endpoint selection */
|
||||
gspca_dev->alt = 0;
|
||||
intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface);
|
||||
gspca_dev->alt = gspca_dev->cam.bulk ? intf->num_altsetting : 0;
|
||||
if (gspca_dev->sd_desc->isoc_init) {
|
||||
ret = gspca_dev->sd_desc->isoc_init(gspca_dev);
|
||||
if (ret < 0)
|
||||
goto unlock;
|
||||
}
|
||||
intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface);
|
||||
xfer = gspca_dev->cam.bulk ? USB_ENDPOINT_XFER_BULK
|
||||
: USB_ENDPOINT_XFER_ISOC;
|
||||
|
||||
|
@ -957,7 +957,7 @@ retry:
|
|||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
alt = ep_tb[--alt_idx].alt;
|
||||
gspca_dev->alt = ep_tb[--alt_idx].alt;
|
||||
}
|
||||
}
|
||||
out:
|
||||
|
|
|
@ -162,7 +162,6 @@ struct m5mols_version {
|
|||
* @pad: media pad
|
||||
* @ffmt: current fmt according to resolution type
|
||||
* @res_type: current resolution type
|
||||
* @code: current code
|
||||
* @irq_waitq: waitqueue for the capture
|
||||
* @work_irq: workqueue for the IRQ
|
||||
* @flags: state variable for the interrupt handler
|
||||
|
@ -192,7 +191,6 @@ struct m5mols_info {
|
|||
struct media_pad pad;
|
||||
struct v4l2_mbus_framefmt ffmt[M5MOLS_RESTYPE_MAX];
|
||||
int res_type;
|
||||
enum v4l2_mbus_pixelcode code;
|
||||
wait_queue_head_t irq_waitq;
|
||||
struct work_struct work_irq;
|
||||
unsigned long flags;
|
||||
|
|
|
@ -334,7 +334,7 @@ int m5mols_mode(struct m5mols_info *info, u8 mode)
|
|||
int ret = -EINVAL;
|
||||
u8 reg;
|
||||
|
||||
if (mode < REG_PARAMETER && mode > REG_CAPTURE)
|
||||
if (mode < REG_PARAMETER || mode > REG_CAPTURE)
|
||||
return ret;
|
||||
|
||||
ret = m5mols_read_u8(sd, SYSTEM_SYSMODE, ®);
|
||||
|
@ -511,9 +511,6 @@ static int m5mols_get_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|||
struct m5mols_info *info = to_m5mols(sd);
|
||||
struct v4l2_mbus_framefmt *format;
|
||||
|
||||
if (fmt->pad != 0)
|
||||
return -EINVAL;
|
||||
|
||||
format = __find_format(info, fh, fmt->which, info->res_type);
|
||||
if (!format)
|
||||
return -EINVAL;
|
||||
|
@ -532,9 +529,6 @@ static int m5mols_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|||
u32 resolution = 0;
|
||||
int ret;
|
||||
|
||||
if (fmt->pad != 0)
|
||||
return -EINVAL;
|
||||
|
||||
ret = __find_resolution(sd, format, &type, &resolution);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -543,13 +537,14 @@ static int m5mols_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh,
|
|||
if (!sfmt)
|
||||
return 0;
|
||||
|
||||
*sfmt = m5mols_default_ffmt[type];
|
||||
sfmt->width = format->width;
|
||||
sfmt->height = format->height;
|
||||
|
||||
format->code = m5mols_default_ffmt[type].code;
|
||||
format->colorspace = V4L2_COLORSPACE_JPEG;
|
||||
format->field = V4L2_FIELD_NONE;
|
||||
|
||||
if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
|
||||
*sfmt = *format;
|
||||
info->resolution = resolution;
|
||||
info->code = format->code;
|
||||
info->res_type = type;
|
||||
}
|
||||
|
||||
|
@ -626,13 +621,14 @@ static int m5mols_start_monitor(struct m5mols_info *info)
|
|||
static int m5mols_s_stream(struct v4l2_subdev *sd, int enable)
|
||||
{
|
||||
struct m5mols_info *info = to_m5mols(sd);
|
||||
u32 code = info->ffmt[info->res_type].code;
|
||||
|
||||
if (enable) {
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (is_code(info->code, M5MOLS_RESTYPE_MONITOR))
|
||||
if (is_code(code, M5MOLS_RESTYPE_MONITOR))
|
||||
ret = m5mols_start_monitor(info);
|
||||
if (is_code(info->code, M5MOLS_RESTYPE_CAPTURE))
|
||||
if (is_code(code, M5MOLS_RESTYPE_CAPTURE))
|
||||
ret = m5mols_start_capture(info);
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -955,6 +955,7 @@ static int mt9m111_probe(struct i2c_client *client,
|
|||
mt9m111->rect.height = MT9M111_MAX_HEIGHT;
|
||||
mt9m111->fmt = &mt9m111_colour_fmts[0];
|
||||
mt9m111->lastpage = -1;
|
||||
mutex_init(&mt9m111->power_lock);
|
||||
|
||||
ret = mt9m111_video_probe(client);
|
||||
if (ret) {
|
||||
|
|
|
@ -1083,8 +1083,10 @@ static int mt9t112_probe(struct i2c_client *client,
|
|||
v4l2_i2c_subdev_init(&priv->subdev, client, &mt9t112_subdev_ops);
|
||||
|
||||
ret = mt9t112_camera_probe(client);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kfree(priv);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Cannot fail: using the default supported pixel code */
|
||||
mt9t112_set_params(priv, &rect, V4L2_MBUS_FMT_UYVY8_2X8);
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <media/videobuf-dma-contig.h>
|
||||
#include <media/v4l2-device.h>
|
||||
|
@ -2169,6 +2170,14 @@ static int __init omap_vout_probe(struct platform_device *pdev)
|
|||
vid_dev->num_displays = 0;
|
||||
for_each_dss_dev(dssdev) {
|
||||
omap_dss_get_device(dssdev);
|
||||
|
||||
if (!dssdev->driver) {
|
||||
dev_warn(&pdev->dev, "no driver for display: %s\n",
|
||||
dssdev->name);
|
||||
omap_dss_put_device(dssdev);
|
||||
continue;
|
||||
}
|
||||
|
||||
vid_dev->displays[vid_dev->num_displays++] = dssdev;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
|
|
|
@ -506,7 +506,7 @@ int omap24xxcam_sgdma_queue(struct omap24xxcam_sgdma *sgdma,
|
|||
unsigned long flags;
|
||||
struct sgdma_state *sg_state;
|
||||
|
||||
if ((sglen < 0) || ((sglen > 0) & !sglist))
|
||||
if ((sglen < 0) || ((sglen > 0) && !sglist))
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&sgdma->lock, flags);
|
||||
|
|
|
@ -1408,7 +1408,7 @@ static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc)
|
|||
{
|
||||
struct isp_pipeline *pipe =
|
||||
to_isp_pipeline(&ccdc->video_out.video.entity);
|
||||
struct video_device *vdev = &ccdc->subdev.devnode;
|
||||
struct video_device *vdev = ccdc->subdev.devnode;
|
||||
struct v4l2_event event;
|
||||
|
||||
memset(&event, 0, sizeof(event));
|
||||
|
|
|
@ -496,7 +496,7 @@ static int isp_stat_bufs_alloc(struct ispstat *stat, u32 size)
|
|||
|
||||
static void isp_stat_queue_event(struct ispstat *stat, int err)
|
||||
{
|
||||
struct video_device *vdev = &stat->subdev.devnode;
|
||||
struct video_device *vdev = stat->subdev.devnode;
|
||||
struct v4l2_event event;
|
||||
struct omap3isp_stat_event_status *status = (void *)event.u.data;
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <asm/cacheflush.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/sched.h>
|
||||
|
|
|
@ -540,7 +540,7 @@ static u8 to_clkrc(struct v4l2_fract *timeperframe,
|
|||
static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct soc_camera_device *icd = (struct soc_camera_device *)sd->grp_id;
|
||||
struct soc_camera_device *icd = v4l2_get_subdev_hostdata(sd);
|
||||
struct soc_camera_sense *sense = icd->sense;
|
||||
struct ov6650 *priv = to_ov6650(client);
|
||||
bool half_scale = !is_unscaled_ok(mf->width, mf->height, &priv->rect);
|
||||
|
|
|
@ -98,6 +98,10 @@ static int fimc_capture_state_cleanup(struct fimc_dev *fimc, bool suspend)
|
|||
vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
|
||||
}
|
||||
set_bit(ST_CAPT_SUSPENDED, &fimc->state);
|
||||
|
||||
fimc_hw_reset(fimc);
|
||||
cap->buf_index = 0;
|
||||
|
||||
spin_unlock_irqrestore(&fimc->slock, flags);
|
||||
|
||||
if (streaming)
|
||||
|
@ -137,7 +141,7 @@ int fimc_capture_config_update(struct fimc_ctx *ctx)
|
|||
struct fimc_dev *fimc = ctx->fimc_dev;
|
||||
int ret;
|
||||
|
||||
if (test_bit(ST_CAPT_APPLY_CFG, &fimc->state))
|
||||
if (!test_bit(ST_CAPT_APPLY_CFG, &fimc->state))
|
||||
return 0;
|
||||
|
||||
spin_lock(&ctx->slock);
|
||||
|
@ -150,7 +154,7 @@ int fimc_capture_config_update(struct fimc_ctx *ctx)
|
|||
fimc_hw_set_rotation(ctx);
|
||||
fimc_prepare_dma_offset(ctx, &ctx->d_frame);
|
||||
fimc_hw_set_out_dma(ctx);
|
||||
set_bit(ST_CAPT_APPLY_CFG, &fimc->state);
|
||||
clear_bit(ST_CAPT_APPLY_CFG, &fimc->state);
|
||||
}
|
||||
spin_unlock(&ctx->slock);
|
||||
return ret;
|
||||
|
@ -164,7 +168,6 @@ static int start_streaming(struct vb2_queue *q, unsigned int count)
|
|||
int min_bufs;
|
||||
int ret;
|
||||
|
||||
fimc_hw_reset(fimc);
|
||||
vid_cap->frame_count = 0;
|
||||
|
||||
ret = fimc_init_capture(fimc);
|
||||
|
@ -523,7 +526,7 @@ static struct fimc_fmt *fimc_capture_try_format(struct fimc_ctx *ctx,
|
|||
max_w = rotation ? pl->out_rot_en_w : pl->out_rot_dis_w;
|
||||
min_w = ctx->state & FIMC_DST_CROP ? dst->width : var->min_out_pixsize;
|
||||
min_h = ctx->state & FIMC_DST_CROP ? dst->height : var->min_out_pixsize;
|
||||
if (fimc->id == 1 && var->pix_hoff)
|
||||
if (var->min_vsize_align == 1 && !rotation)
|
||||
align_h = fimc_fmt_is_rgb(ffmt->color) ? 0 : 1;
|
||||
|
||||
depth = fimc_get_format_depth(ffmt);
|
||||
|
@ -1239,6 +1242,7 @@ static int fimc_subdev_set_fmt(struct v4l2_subdev *sd,
|
|||
|
||||
mutex_lock(&fimc->lock);
|
||||
set_frame_bounds(ff, mf->width, mf->height);
|
||||
fimc->vid_cap.mf = *mf;
|
||||
ff->fmt = ffmt;
|
||||
|
||||
/* Reset the crop rectangle if required. */
|
||||
|
@ -1375,7 +1379,7 @@ static void fimc_destroy_capture_subdev(struct fimc_dev *fimc)
|
|||
media_entity_cleanup(&sd->entity);
|
||||
v4l2_device_unregister_subdev(sd);
|
||||
kfree(sd);
|
||||
sd = NULL;
|
||||
fimc->vid_cap.subdev = NULL;
|
||||
}
|
||||
|
||||
/* Set default format at the sensor and host interface */
|
||||
|
|
|
@ -37,7 +37,7 @@ static char *fimc_clocks[MAX_FIMC_CLOCKS] = {
|
|||
static struct fimc_fmt fimc_formats[] = {
|
||||
{
|
||||
.name = "RGB565",
|
||||
.fourcc = V4L2_PIX_FMT_RGB565X,
|
||||
.fourcc = V4L2_PIX_FMT_RGB565,
|
||||
.depth = { 16 },
|
||||
.color = S5P_FIMC_RGB565,
|
||||
.memplanes = 1,
|
||||
|
@ -1038,12 +1038,11 @@ static int fimc_try_fmt_mplane(struct fimc_ctx *ctx, struct v4l2_format *f)
|
|||
mod_x = 6; /* 64 x 32 pixels tile */
|
||||
mod_y = 5;
|
||||
} else {
|
||||
if (fimc->id == 1 && variant->pix_hoff)
|
||||
if (variant->min_vsize_align == 1)
|
||||
mod_y = fimc_fmt_is_rgb(fmt->color) ? 0 : 1;
|
||||
else
|
||||
mod_y = mod_x;
|
||||
mod_y = ffs(variant->min_vsize_align) - 1;
|
||||
}
|
||||
dbg("mod_x: %d, mod_y: %d, max_w: %d", mod_x, mod_y, max_w);
|
||||
|
||||
v4l_bound_align_image(&pix->width, 16, max_w, mod_x,
|
||||
&pix->height, 8, variant->pix_limit->scaler_dis_w, mod_y, 0);
|
||||
|
@ -1226,10 +1225,10 @@ static int fimc_m2m_try_crop(struct fimc_ctx *ctx, struct v4l2_crop *cr)
|
|||
fimc->variant->min_inp_pixsize : fimc->variant->min_out_pixsize;
|
||||
|
||||
/* Get pixel alignment constraints. */
|
||||
if (fimc->id == 1 && fimc->variant->pix_hoff)
|
||||
if (fimc->variant->min_vsize_align == 1)
|
||||
halign = fimc_fmt_is_rgb(f->fmt->color) ? 0 : 1;
|
||||
else
|
||||
halign = ffs(min_size) - 1;
|
||||
halign = ffs(fimc->variant->min_vsize_align) - 1;
|
||||
|
||||
for (i = 0; i < f->fmt->colplanes; i++)
|
||||
depth += f->fmt->depth[i];
|
||||
|
@ -1615,7 +1614,6 @@ static int fimc_probe(struct platform_device *pdev)
|
|||
pdata = pdev->dev.platform_data;
|
||||
fimc->pdata = pdata;
|
||||
|
||||
set_bit(ST_LPM, &fimc->state);
|
||||
|
||||
init_waitqueue_head(&fimc->irq_queue);
|
||||
spin_lock_init(&fimc->slock);
|
||||
|
@ -1707,8 +1705,6 @@ static int fimc_runtime_resume(struct device *dev)
|
|||
/* Enable clocks and perform basic initalization */
|
||||
clk_enable(fimc->clock[CLK_GATE]);
|
||||
fimc_hw_reset(fimc);
|
||||
if (fimc->variant->out_buf_count > 4)
|
||||
fimc_hw_set_dma_seq(fimc, 0xF);
|
||||
|
||||
/* Resume the capture or mem-to-mem device */
|
||||
if (fimc_capture_busy(fimc))
|
||||
|
@ -1750,8 +1746,6 @@ static int fimc_resume(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
fimc_hw_reset(fimc);
|
||||
if (fimc->variant->out_buf_count > 4)
|
||||
fimc_hw_set_dma_seq(fimc, 0xF);
|
||||
spin_unlock_irqrestore(&fimc->slock, flags);
|
||||
|
||||
if (fimc_capture_busy(fimc))
|
||||
|
@ -1780,7 +1774,6 @@ static int __devexit fimc_remove(struct platform_device *pdev)
|
|||
struct fimc_dev *fimc = platform_get_drvdata(pdev);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
fimc_runtime_suspend(&pdev->dev);
|
||||
pm_runtime_set_suspended(&pdev->dev);
|
||||
|
||||
vb2_dma_contig_cleanup_ctx(fimc->alloc_ctx);
|
||||
|
@ -1840,6 +1833,7 @@ static struct samsung_fimc_variant fimc0_variant_s5p = {
|
|||
.min_inp_pixsize = 16,
|
||||
.min_out_pixsize = 16,
|
||||
.hor_offs_align = 8,
|
||||
.min_vsize_align = 16,
|
||||
.out_buf_count = 4,
|
||||
.pix_limit = &s5p_pix_limit[0],
|
||||
};
|
||||
|
@ -1849,6 +1843,7 @@ static struct samsung_fimc_variant fimc2_variant_s5p = {
|
|||
.min_inp_pixsize = 16,
|
||||
.min_out_pixsize = 16,
|
||||
.hor_offs_align = 8,
|
||||
.min_vsize_align = 16,
|
||||
.out_buf_count = 4,
|
||||
.pix_limit = &s5p_pix_limit[1],
|
||||
};
|
||||
|
@ -1861,6 +1856,7 @@ static struct samsung_fimc_variant fimc0_variant_s5pv210 = {
|
|||
.min_inp_pixsize = 16,
|
||||
.min_out_pixsize = 16,
|
||||
.hor_offs_align = 8,
|
||||
.min_vsize_align = 16,
|
||||
.out_buf_count = 4,
|
||||
.pix_limit = &s5p_pix_limit[1],
|
||||
};
|
||||
|
@ -1874,6 +1870,7 @@ static struct samsung_fimc_variant fimc1_variant_s5pv210 = {
|
|||
.min_inp_pixsize = 16,
|
||||
.min_out_pixsize = 16,
|
||||
.hor_offs_align = 1,
|
||||
.min_vsize_align = 1,
|
||||
.out_buf_count = 4,
|
||||
.pix_limit = &s5p_pix_limit[2],
|
||||
};
|
||||
|
@ -1884,6 +1881,7 @@ static struct samsung_fimc_variant fimc2_variant_s5pv210 = {
|
|||
.min_inp_pixsize = 16,
|
||||
.min_out_pixsize = 16,
|
||||
.hor_offs_align = 8,
|
||||
.min_vsize_align = 16,
|
||||
.out_buf_count = 4,
|
||||
.pix_limit = &s5p_pix_limit[2],
|
||||
};
|
||||
|
@ -1898,6 +1896,7 @@ static struct samsung_fimc_variant fimc0_variant_exynos4 = {
|
|||
.min_inp_pixsize = 16,
|
||||
.min_out_pixsize = 16,
|
||||
.hor_offs_align = 2,
|
||||
.min_vsize_align = 1,
|
||||
.out_buf_count = 32,
|
||||
.pix_limit = &s5p_pix_limit[1],
|
||||
};
|
||||
|
@ -1910,6 +1909,7 @@ static struct samsung_fimc_variant fimc3_variant_exynos4 = {
|
|||
.min_inp_pixsize = 16,
|
||||
.min_out_pixsize = 16,
|
||||
.hor_offs_align = 2,
|
||||
.min_vsize_align = 1,
|
||||
.out_buf_count = 32,
|
||||
.pix_limit = &s5p_pix_limit[3],
|
||||
};
|
||||
|
|
|
@ -377,6 +377,7 @@ struct fimc_pix_limit {
|
|||
* @min_inp_pixsize: minimum input pixel size
|
||||
* @min_out_pixsize: minimum output pixel size
|
||||
* @hor_offs_align: horizontal pixel offset aligment
|
||||
* @min_vsize_align: minimum vertical pixel size alignment
|
||||
* @out_buf_count: the number of buffers in output DMA sequence
|
||||
*/
|
||||
struct samsung_fimc_variant {
|
||||
|
@ -390,6 +391,7 @@ struct samsung_fimc_variant {
|
|||
u16 min_inp_pixsize;
|
||||
u16 min_out_pixsize;
|
||||
u16 hor_offs_align;
|
||||
u16 min_vsize_align;
|
||||
u16 out_buf_count;
|
||||
};
|
||||
|
||||
|
|
|
@ -220,6 +220,7 @@ static struct v4l2_subdev *fimc_md_register_sensor(struct fimc_md *fmd,
|
|||
sd = v4l2_i2c_new_subdev_board(&fmd->v4l2_dev, adapter,
|
||||
s_info->pdata->board_info, NULL);
|
||||
if (IS_ERR_OR_NULL(sd)) {
|
||||
i2c_put_adapter(adapter);
|
||||
v4l2_err(&fmd->v4l2_dev, "Failed to acquire subdev\n");
|
||||
return NULL;
|
||||
}
|
||||
|
@ -234,12 +235,15 @@ static struct v4l2_subdev *fimc_md_register_sensor(struct fimc_md *fmd,
|
|||
static void fimc_md_unregister_sensor(struct v4l2_subdev *sd)
|
||||
{
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
struct i2c_adapter *adapter;
|
||||
|
||||
if (!client)
|
||||
return;
|
||||
v4l2_device_unregister_subdev(sd);
|
||||
adapter = client->adapter;
|
||||
i2c_unregister_device(client);
|
||||
i2c_put_adapter(client->adapter);
|
||||
if (adapter)
|
||||
i2c_put_adapter(adapter);
|
||||
}
|
||||
|
||||
static int fimc_md_register_sensor_entities(struct fimc_md *fmd)
|
||||
|
@ -381,20 +385,28 @@ static void fimc_md_unregister_entities(struct fimc_md *fmd)
|
|||
|
||||
static int fimc_md_register_video_nodes(struct fimc_md *fmd)
|
||||
{
|
||||
struct video_device *vdev;
|
||||
int i, ret = 0;
|
||||
|
||||
for (i = 0; i < FIMC_MAX_DEVS && !ret; i++) {
|
||||
if (!fmd->fimc[i])
|
||||
continue;
|
||||
|
||||
if (fmd->fimc[i]->m2m.vfd)
|
||||
ret = video_register_device(fmd->fimc[i]->m2m.vfd,
|
||||
VFL_TYPE_GRABBER, -1);
|
||||
if (ret)
|
||||
break;
|
||||
if (fmd->fimc[i]->vid_cap.vfd)
|
||||
ret = video_register_device(fmd->fimc[i]->vid_cap.vfd,
|
||||
VFL_TYPE_GRABBER, -1);
|
||||
vdev = fmd->fimc[i]->m2m.vfd;
|
||||
if (vdev) {
|
||||
ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
||||
if (ret)
|
||||
break;
|
||||
v4l2_info(&fmd->v4l2_dev, "Registered %s as /dev/%s\n",
|
||||
vdev->name, video_device_node_name(vdev));
|
||||
}
|
||||
|
||||
vdev = fmd->fimc[i]->vid_cap.vfd;
|
||||
if (vdev == NULL)
|
||||
continue;
|
||||
ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
|
||||
v4l2_info(&fmd->v4l2_dev, "Registered %s as /dev/%s\n",
|
||||
vdev->name, video_device_node_name(vdev));
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -502,7 +514,7 @@ static int fimc_md_create_links(struct fimc_md *fmd)
|
|||
if (WARN(csis == NULL,
|
||||
"MIPI-CSI interface specified "
|
||||
"but s5p-csis module is not loaded!\n"))
|
||||
continue;
|
||||
return -EINVAL;
|
||||
|
||||
ret = media_entity_create_link(&sensor->entity, 0,
|
||||
&csis->entity, CSIS_PAD_SINK,
|
||||
|
@ -742,9 +754,6 @@ static int __devinit fimc_md_probe(struct platform_device *pdev)
|
|||
struct fimc_md *fmd;
|
||||
int ret;
|
||||
|
||||
if (WARN(!pdev->dev.platform_data, "Platform data not specified!\n"))
|
||||
return -EINVAL;
|
||||
|
||||
fmd = kzalloc(sizeof(struct fimc_md), GFP_KERNEL);
|
||||
if (!fmd)
|
||||
return -ENOMEM;
|
||||
|
@ -782,9 +791,11 @@ static int __devinit fimc_md_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
goto err3;
|
||||
|
||||
ret = fimc_md_register_sensor_entities(fmd);
|
||||
if (ret)
|
||||
goto err3;
|
||||
if (pdev->dev.platform_data) {
|
||||
ret = fimc_md_register_sensor_entities(fmd);
|
||||
if (ret)
|
||||
goto err3;
|
||||
}
|
||||
ret = fimc_md_create_links(fmd);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
|
|
@ -35,6 +35,9 @@ void fimc_hw_reset(struct fimc_dev *dev)
|
|||
cfg = readl(dev->regs + S5P_CIGCTRL);
|
||||
cfg &= ~S5P_CIGCTRL_SWRST;
|
||||
writel(cfg, dev->regs + S5P_CIGCTRL);
|
||||
|
||||
if (dev->variant->out_buf_count > 4)
|
||||
fimc_hw_set_dma_seq(dev, 0xF);
|
||||
}
|
||||
|
||||
static u32 fimc_hw_get_in_flip(struct fimc_ctx *ctx)
|
||||
|
@ -251,7 +254,14 @@ static void fimc_hw_set_scaler(struct fimc_ctx *ctx)
|
|||
struct fimc_scaler *sc = &ctx->scaler;
|
||||
struct fimc_frame *src_frame = &ctx->s_frame;
|
||||
struct fimc_frame *dst_frame = &ctx->d_frame;
|
||||
u32 cfg = 0;
|
||||
|
||||
u32 cfg = readl(dev->regs + S5P_CISCCTRL);
|
||||
|
||||
cfg &= ~(S5P_CISCCTRL_CSCR2Y_WIDE | S5P_CISCCTRL_CSCY2R_WIDE |
|
||||
S5P_CISCCTRL_SCALEUP_H | S5P_CISCCTRL_SCALEUP_V |
|
||||
S5P_CISCCTRL_SCALERBYPASS | S5P_CISCCTRL_ONE2ONE |
|
||||
S5P_CISCCTRL_INRGB_FMT_MASK | S5P_CISCCTRL_OUTRGB_FMT_MASK |
|
||||
S5P_CISCCTRL_INTERLACE | S5P_CISCCTRL_RGB_EXT);
|
||||
|
||||
if (!(ctx->flags & FIMC_COLOR_RANGE_NARROW))
|
||||
cfg |= (S5P_CISCCTRL_CSCR2Y_WIDE | S5P_CISCCTRL_CSCY2R_WIDE);
|
||||
|
@ -308,9 +318,9 @@ void fimc_hw_set_mainscaler(struct fimc_ctx *ctx)
|
|||
fimc_hw_set_scaler(ctx);
|
||||
|
||||
cfg = readl(dev->regs + S5P_CISCCTRL);
|
||||
cfg &= ~(S5P_CISCCTRL_MHRATIO_MASK | S5P_CISCCTRL_MVRATIO_MASK);
|
||||
|
||||
if (variant->has_mainscaler_ext) {
|
||||
cfg &= ~(S5P_CISCCTRL_MHRATIO_MASK | S5P_CISCCTRL_MVRATIO_MASK);
|
||||
cfg |= S5P_CISCCTRL_MHRATIO_EXT(sc->main_hratio);
|
||||
cfg |= S5P_CISCCTRL_MVRATIO_EXT(sc->main_vratio);
|
||||
writel(cfg, dev->regs + S5P_CISCCTRL);
|
||||
|
@ -323,7 +333,6 @@ void fimc_hw_set_mainscaler(struct fimc_ctx *ctx)
|
|||
cfg |= S5P_CIEXTEN_MVRATIO_EXT(sc->main_vratio);
|
||||
writel(cfg, dev->regs + S5P_CIEXTEN);
|
||||
} else {
|
||||
cfg &= ~(S5P_CISCCTRL_MHRATIO_MASK | S5P_CISCCTRL_MVRATIO_MASK);
|
||||
cfg |= S5P_CISCCTRL_MHRATIO(sc->main_hratio);
|
||||
cfg |= S5P_CISCCTRL_MVRATIO(sc->main_vratio);
|
||||
writel(cfg, dev->regs + S5P_CISCCTRL);
|
||||
|
|
|
@ -61,7 +61,7 @@ static struct s5p_mfc_fmt formats[] = {
|
|||
.num_planes = 1,
|
||||
},
|
||||
{
|
||||
.name = "H264 Encoded Stream",
|
||||
.name = "H263 Encoded Stream",
|
||||
.fourcc = V4L2_PIX_FMT_H263,
|
||||
.codec_mode = S5P_FIMV_CODEC_H263_ENC,
|
||||
.type = MFC_FMT_ENC,
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <media/v4l2-ioctl.h>
|
||||
#include <linux/videodev2.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/timer.h>
|
||||
#include <media/videobuf2-dma-contig.h>
|
||||
|
|
|
@ -566,8 +566,10 @@ static int sh_mobile_ceu_add_device(struct soc_camera_device *icd)
|
|||
ret = sh_mobile_ceu_soft_reset(pcdev);
|
||||
|
||||
csi2_sd = find_csi2(pcdev);
|
||||
if (csi2_sd)
|
||||
csi2_sd->grp_id = (long)icd;
|
||||
if (csi2_sd) {
|
||||
csi2_sd->grp_id = soc_camera_grp_id(icd);
|
||||
v4l2_set_subdev_hostdata(csi2_sd, icd);
|
||||
}
|
||||
|
||||
ret = v4l2_subdev_call(csi2_sd, core, s_power, 1);
|
||||
if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV) {
|
||||
|
@ -768,7 +770,7 @@ static struct v4l2_subdev *find_bus_subdev(struct sh_mobile_ceu_dev *pcdev,
|
|||
{
|
||||
if (pcdev->csi2_pdev) {
|
||||
struct v4l2_subdev *csi2_sd = find_csi2(pcdev);
|
||||
if (csi2_sd && csi2_sd->grp_id == (u32)icd)
|
||||
if (csi2_sd && csi2_sd->grp_id == soc_camera_grp_id(icd))
|
||||
return csi2_sd;
|
||||
}
|
||||
|
||||
|
@ -1089,8 +1091,9 @@ static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int
|
|||
/* Try 2560x1920, 1280x960, 640x480, 320x240 */
|
||||
mf.width = 2560 >> shift;
|
||||
mf.height = 1920 >> shift;
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
|
||||
s_mbus_fmt, &mf);
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev,
|
||||
soc_camera_grp_id(icd), video,
|
||||
s_mbus_fmt, &mf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
shift++;
|
||||
|
@ -1389,7 +1392,8 @@ static int client_s_fmt(struct soc_camera_device *icd,
|
|||
bool ceu_1to1;
|
||||
int ret;
|
||||
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev,
|
||||
soc_camera_grp_id(icd), video,
|
||||
s_mbus_fmt, mf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -1426,8 +1430,9 @@ static int client_s_fmt(struct soc_camera_device *icd,
|
|||
tmp_h = min(2 * tmp_h, max_height);
|
||||
mf->width = tmp_w;
|
||||
mf->height = tmp_h;
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
|
||||
s_mbus_fmt, mf);
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev,
|
||||
soc_camera_grp_id(icd), video,
|
||||
s_mbus_fmt, mf);
|
||||
dev_geo(dev, "Camera scaled to %ux%u\n",
|
||||
mf->width, mf->height);
|
||||
if (ret < 0) {
|
||||
|
@ -1580,8 +1585,9 @@ static int sh_mobile_ceu_set_crop(struct soc_camera_device *icd,
|
|||
}
|
||||
|
||||
if (interm_width < icd->user_width || interm_height < icd->user_height) {
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev, (int)icd, video,
|
||||
s_mbus_fmt, &mf);
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev,
|
||||
soc_camera_grp_id(icd), video,
|
||||
s_mbus_fmt, &mf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -1867,7 +1873,8 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
|
|||
mf.code = xlate->code;
|
||||
mf.colorspace = pix->colorspace;
|
||||
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf);
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev, soc_camera_grp_id(icd),
|
||||
video, try_mbus_fmt, &mf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -1891,8 +1898,9 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
|
|||
*/
|
||||
mf.width = 2560;
|
||||
mf.height = 1920;
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
|
||||
try_mbus_fmt, &mf);
|
||||
ret = v4l2_device_call_until_err(sd->v4l2_dev,
|
||||
soc_camera_grp_id(icd), video,
|
||||
try_mbus_fmt, &mf);
|
||||
if (ret < 0) {
|
||||
/* Shouldn't actually happen... */
|
||||
dev_err(icd->parent,
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue