mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-03 17:14:14 +08:00
Linux 3.5-rc7
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.18 (GNU/Linux) iQEcBAABAgAGBQJQAfWKAAoJEHm+PkMAQRiG/DwIAIullMhkDhD/GJcn24ZbUJoa v6zRPK2hIavuKH/6bUoUiXT346PUYgVnRMhetuYKJFURz6KX/nmlxve/iXNn/WP1 9hnxhE+zcnp2qKI83c3Yok09eed1KnGY5hWQkqXM2gzji/OU0pCKchOcL01l//uz iiWpNAXEVUnT92CafnHlZ55f/MWVqRFmDKi3Ty1YKSskhojQ6NOPsWCxrTxKVbim 2YPXc3D+xLHzF12ufVgla20AF4KnK8m+tFugniRAqArIagpzBUP1x1wk0RN5PyBD FTP8lv7bSfBusp41/mPDB66WAe9EfQBoWQY6jloJjp0i8xnMyH5V05pImBV5NwU= =O+gl -----END PGP SIGNATURE----- Merge tag 'v3.5-rc7' into next/boards Linux 3.5-rc7 Prerequisite for samsung/board3 branch. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
608f593b13
@ -142,13 +142,14 @@ KernelVersion: 3.4
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
This allows the user to examine and adjust the criteria by which
|
||||
mtd returns -EUCLEAN from mtd_read(). If the maximum number of
|
||||
bit errors that were corrected on any single region comprising
|
||||
an ecc step (as reported by the driver) equals or exceeds this
|
||||
value, -EUCLEAN is returned. Otherwise, absent an error, 0 is
|
||||
returned. Higher layers (e.g., UBI) use this return code as an
|
||||
indication that an erase block may be degrading and should be
|
||||
scrutinized as a candidate for being marked as bad.
|
||||
mtd returns -EUCLEAN from mtd_read() and mtd_read_oob(). If the
|
||||
maximum number of bit errors that were corrected on any single
|
||||
region comprising an ecc step (as reported by the driver) equals
|
||||
or exceeds this value, -EUCLEAN is returned. Otherwise, absent
|
||||
an error, 0 is returned. Higher layers (e.g., UBI) use this
|
||||
return code as an indication that an erase block may be
|
||||
degrading and should be scrutinized as a candidate for being
|
||||
marked as bad.
|
||||
|
||||
The initial value may be specified by the flash device driver.
|
||||
If not, then the default value is ecc_strength.
|
||||
@ -167,7 +168,7 @@ Description:
|
||||
block degradation, but high enough to avoid the consequences of
|
||||
a persistent return value of -EUCLEAN on devices where sticky
|
||||
bitflips occur. Note that if bitflip_threshold exceeds
|
||||
ecc_strength, -EUCLEAN is never returned by mtd_read().
|
||||
ecc_strength, -EUCLEAN is never returned by the read operations.
|
||||
Conversely, if bitflip_threshold is zero, -EUCLEAN is always
|
||||
returned, absent a hard error.
|
||||
|
||||
|
@ -3988,7 +3988,7 @@ interface and may change in the future.</para>
|
||||
from RGB to Y'CbCr color space.
|
||||
</entry>
|
||||
</row>
|
||||
<row id = "v4l2-jpeg-chroma-subsampling">
|
||||
<row>
|
||||
<entrytbl spanname="descr" cols="2">
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
|
@ -284,13 +284,6 @@ These controls are described in <xref
|
||||
processing controls. These controls are described in <xref
|
||||
linkend="image-process-controls" />.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_CTRL_CLASS_JPEG</constant></entry>
|
||||
<entry>0x9d0000</entry>
|
||||
<entry>The class containing JPEG compression controls.
|
||||
These controls are described in <xref
|
||||
linkend="jpeg-controls" />.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
@ -4857,6 +4857,7 @@ M: Kevin Hilman <khilman@ti.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/arm/*omap*/*pm*
|
||||
F: drivers/cpufreq/omap-cpufreq.c
|
||||
|
||||
OMAP POWERDOMAIN/CLOCKDOMAIN SOC ADAPTATION LAYER SUPPORT
|
||||
M: Rajendra Nayak <rnayak@ti.com>
|
||||
@ -5909,7 +5910,7 @@ M: Ingo Molnar <mingo@redhat.com>
|
||||
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: kernel/sched/
|
||||
F: include/linux/sched.h
|
||||
|
||||
SCORE ARCHITECTURE
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 5
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Saber-toothed Squirrel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -176,7 +176,6 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
CONFIG_USB_SUSPEND=y
|
||||
CONFIG_USB_MON=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_WDM=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_LIBUSUAL=y
|
||||
|
@ -119,7 +119,9 @@ static __init void exynos_pm_add_dev_to_genpd(struct platform_device *pdev,
|
||||
struct exynos_pm_domain *pd)
|
||||
{
|
||||
if (pdev->dev.bus) {
|
||||
if (pm_genpd_add_device(&pd->pd, &pdev->dev))
|
||||
if (!pm_genpd_add_device(&pd->pd, &pdev->dev))
|
||||
pm_genpd_dev_need_restore(&pdev->dev, true);
|
||||
else
|
||||
pr_info("%s: error in adding %s device to %s power"
|
||||
"domain\n", __func__, dev_name(&pdev->dev),
|
||||
pd->name);
|
||||
@ -151,9 +153,12 @@ static __init int exynos4_pm_init_power_domain(void)
|
||||
if (of_have_populated_dt())
|
||||
return exynos_pm_dt_parse_domains();
|
||||
|
||||
for (idx = 0; idx < ARRAY_SIZE(exynos4_pm_domains); idx++)
|
||||
pm_genpd_init(&exynos4_pm_domains[idx]->pd, NULL,
|
||||
exynos4_pm_domains[idx]->is_off);
|
||||
for (idx = 0; idx < ARRAY_SIZE(exynos4_pm_domains); idx++) {
|
||||
struct exynos_pm_domain *pd = exynos4_pm_domains[idx];
|
||||
int on = __raw_readl(pd->base + 0x4) & S5P_INT_LOCAL_PWR_EN;
|
||||
|
||||
pm_genpd_init(&pd->pd, NULL, !on);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_S5P_DEV_FIMD0
|
||||
exynos_pm_add_dev_to_genpd(&s5p_device_fimd0, &exynos4_pd_lcd0);
|
||||
|
@ -31,12 +31,16 @@
|
||||
*
|
||||
* CLKDM_NO_AUTODEPS: Prevent "autodeps" from being added/removed from this
|
||||
* clockdomain. (Currently, this applies to OMAP3 clockdomains only.)
|
||||
* CLKDM_ACTIVE_WITH_MPU: The PRCM guarantees that this clockdomain is
|
||||
* active whenever the MPU is active. True for interconnects and
|
||||
* the WKUP clockdomains.
|
||||
*/
|
||||
#define CLKDM_CAN_FORCE_SLEEP (1 << 0)
|
||||
#define CLKDM_CAN_FORCE_WAKEUP (1 << 1)
|
||||
#define CLKDM_CAN_ENABLE_AUTO (1 << 2)
|
||||
#define CLKDM_CAN_DISABLE_AUTO (1 << 3)
|
||||
#define CLKDM_NO_AUTODEPS (1 << 4)
|
||||
#define CLKDM_ACTIVE_WITH_MPU (1 << 5)
|
||||
|
||||
#define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO)
|
||||
#define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP)
|
||||
|
@ -88,4 +88,5 @@ struct clockdomain wkup_common_clkdm = {
|
||||
.name = "wkup_clkdm",
|
||||
.pwrdm = { .name = "wkup_pwrdm" },
|
||||
.dep_bit = OMAP_EN_WKUP_SHIFT,
|
||||
.flags = CLKDM_ACTIVE_WITH_MPU,
|
||||
};
|
||||
|
@ -381,7 +381,7 @@ static struct clockdomain l4_wkup_44xx_clkdm = {
|
||||
.cm_inst = OMAP4430_PRM_WKUP_CM_INST,
|
||||
.clkdm_offs = OMAP4430_PRM_WKUP_CM_WKUP_CDOFFS,
|
||||
.dep_bit = OMAP4430_L4WKUP_STATDEP_SHIFT,
|
||||
.flags = CLKDM_CAN_HWSUP,
|
||||
.flags = CLKDM_CAN_HWSUP | CLKDM_ACTIVE_WITH_MPU,
|
||||
};
|
||||
|
||||
static struct clockdomain emu_sys_44xx_clkdm = {
|
||||
|
@ -1124,15 +1124,18 @@ static struct omap_hwmod_addr_space * __init _find_mpu_rt_addr_space(struct omap
|
||||
* _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* If module is marked as SWSUP_SIDLE, force the module out of slave
|
||||
* idle; otherwise, configure it for smart-idle. If module is marked
|
||||
* as SWSUP_MSUSPEND, force the module out of master standby;
|
||||
* otherwise, configure it for smart-standby. No return value.
|
||||
* Ensure that the OCP_SYSCONFIG register for the IP block represented
|
||||
* by @oh is set to indicate to the PRCM that the IP block is active.
|
||||
* Usually this means placing the module into smart-idle mode and
|
||||
* smart-standby, but if there is a bug in the automatic idle handling
|
||||
* for the IP block, it may need to be placed into the force-idle or
|
||||
* no-idle variants of these modes. No return value.
|
||||
*/
|
||||
static void _enable_sysc(struct omap_hwmod *oh)
|
||||
{
|
||||
u8 idlemode, sf;
|
||||
u32 v;
|
||||
bool clkdm_act;
|
||||
|
||||
if (!oh->class->sysc)
|
||||
return;
|
||||
@ -1141,8 +1144,16 @@ static void _enable_sysc(struct omap_hwmod *oh)
|
||||
sf = oh->class->sysc->sysc_flags;
|
||||
|
||||
if (sf & SYSC_HAS_SIDLEMODE) {
|
||||
idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
|
||||
HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART;
|
||||
clkdm_act = ((oh->clkdm &&
|
||||
oh->clkdm->flags & CLKDM_ACTIVE_WITH_MPU) ||
|
||||
(oh->_clk && oh->_clk->clkdm &&
|
||||
oh->_clk->clkdm->flags & CLKDM_ACTIVE_WITH_MPU));
|
||||
if (clkdm_act && !(oh->class->sysc->idlemodes &
|
||||
(SIDLE_SMART | SIDLE_SMART_WKUP)))
|
||||
idlemode = HWMOD_IDLEMODE_FORCE;
|
||||
else
|
||||
idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
|
||||
HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART;
|
||||
_set_slave_idlemode(oh, idlemode, &v);
|
||||
}
|
||||
|
||||
@ -1208,8 +1219,13 @@ static void _idle_sysc(struct omap_hwmod *oh)
|
||||
sf = oh->class->sysc->sysc_flags;
|
||||
|
||||
if (sf & SYSC_HAS_SIDLEMODE) {
|
||||
idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
|
||||
HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART;
|
||||
/* XXX What about HWMOD_IDLEMODE_SMART_WKUP? */
|
||||
if (oh->flags & HWMOD_SWSUP_SIDLE ||
|
||||
!(oh->class->sysc->idlemodes &
|
||||
(SIDLE_SMART | SIDLE_SMART_WKUP)))
|
||||
idlemode = HWMOD_IDLEMODE_FORCE;
|
||||
else
|
||||
idlemode = HWMOD_IDLEMODE_SMART;
|
||||
_set_slave_idlemode(oh, idlemode, &v);
|
||||
}
|
||||
|
||||
|
@ -106,7 +106,7 @@ static struct clk s3c2440_clk_cam_upll = {
|
||||
static struct clk s3c2440_clk_ac97 = {
|
||||
.name = "ac97",
|
||||
.enable = s3c2410_clkcon_enable,
|
||||
.ctrlbit = S3C2440_CLKCON_CAMERA,
|
||||
.ctrlbit = S3C2440_CLKCON_AC97,
|
||||
};
|
||||
|
||||
static unsigned long s3c2440_fclk_n_getrate(struct clk *clk)
|
||||
|
@ -22,8 +22,13 @@
|
||||
#include <mach/common.h>
|
||||
#include <mach/emev2.h>
|
||||
|
||||
#ifdef CONFIG_ARCH_SH73A0
|
||||
#define is_sh73a0() (machine_is_ag5evm() || machine_is_kota2() || \
|
||||
of_machine_is_compatible("renesas,sh73a0"))
|
||||
#else
|
||||
#define is_sh73a0() (0)
|
||||
#endif
|
||||
|
||||
#define is_r8a7779() machine_is_marzen()
|
||||
|
||||
#ifdef CONFIG_ARCH_EMEV2
|
||||
|
@ -625,11 +625,6 @@ static struct platform_device *snowball_platform_devs[] __initdata = {
|
||||
&ab8500_device,
|
||||
};
|
||||
|
||||
static struct platform_device *snowball_of_platform_devs[] __initdata = {
|
||||
&snowball_led_dev,
|
||||
&snowball_key_dev,
|
||||
};
|
||||
|
||||
static void __init mop500_init_machine(void)
|
||||
{
|
||||
struct device *parent = NULL;
|
||||
@ -769,6 +764,11 @@ MACHINE_END
|
||||
|
||||
#ifdef CONFIG_MACH_UX500_DT
|
||||
|
||||
static struct platform_device *snowball_of_platform_devs[] __initdata = {
|
||||
&snowball_led_dev,
|
||||
&snowball_key_dev,
|
||||
};
|
||||
|
||||
struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
|
||||
/* Requires DMA and call-back bindings. */
|
||||
OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat),
|
||||
@ -786,6 +786,8 @@ struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
|
||||
OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL),
|
||||
OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL),
|
||||
OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL),
|
||||
/* Requires device name bindings. */
|
||||
OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL),
|
||||
{},
|
||||
};
|
||||
|
||||
|
@ -63,8 +63,10 @@ static void __init ux500_timer_init(void)
|
||||
|
||||
/* TODO: Once MTU has been DT:ed place code above into else. */
|
||||
if (of_have_populated_dt()) {
|
||||
#ifdef CONFIG_OF
|
||||
np = of_find_matching_node(NULL, prcmu_timer_of_match);
|
||||
if (!np)
|
||||
#endif
|
||||
goto dt_fail;
|
||||
|
||||
tmp_base = of_iomap(np, 0);
|
||||
|
@ -157,11 +157,13 @@ int s3c_adc_start(struct s3c_adc_client *client,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (client->is_ts && adc->ts_pend)
|
||||
return -EAGAIN;
|
||||
|
||||
spin_lock_irqsave(&adc->lock, flags);
|
||||
|
||||
if (client->is_ts && adc->ts_pend) {
|
||||
spin_unlock_irqrestore(&adc->lock, flags);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
client->channel = channel;
|
||||
client->nr_samples = nr_samples;
|
||||
|
||||
|
@ -126,7 +126,8 @@ struct platform_device s3c_device_adc = {
|
||||
#ifdef CONFIG_CPU_S3C2440
|
||||
static struct resource s3c_camif_resource[] = {
|
||||
[0] = DEFINE_RES_MEM(S3C2440_PA_CAMIF, S3C2440_SZ_CAMIF),
|
||||
[1] = DEFINE_RES_IRQ(IRQ_CAM),
|
||||
[1] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_C),
|
||||
[2] = DEFINE_RES_IRQ(IRQ_S3C2440_CAM_P),
|
||||
};
|
||||
|
||||
struct platform_device s3c_device_camif = {
|
||||
|
@ -37,6 +37,7 @@ struct clk clk_ext_xtal_mux = {
|
||||
struct clk clk_xusbxti = {
|
||||
.name = "xusbxti",
|
||||
.id = -1,
|
||||
.rate = 24000000,
|
||||
};
|
||||
|
||||
struct clk s5p_clk_27m = {
|
||||
|
@ -70,4 +70,7 @@ extern int is_in_rom(unsigned long);
|
||||
#define VMALLOC_END 0xffffffff
|
||||
|
||||
#define arch_enter_lazy_cpu_mode() do {} while (0)
|
||||
|
||||
#include <asm-generic/pgtable.h>
|
||||
|
||||
#endif /* _H8300_PGTABLE_H */
|
||||
|
@ -100,7 +100,6 @@ extern int __put_user_bad(void);
|
||||
break; \
|
||||
default: \
|
||||
__gu_err = __get_user_bad(); \
|
||||
__gu_val = 0; \
|
||||
break; \
|
||||
} \
|
||||
(x) = __gu_val; \
|
||||
@ -159,4 +158,6 @@ clear_user(void *to, unsigned long n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define __clear_user clear_user
|
||||
|
||||
#endif /* _H8300_UACCESS_H */
|
||||
|
@ -447,7 +447,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
|
||||
* want to handle. Thus you cannot kill init even with a SIGKILL even by
|
||||
* mistake.
|
||||
*/
|
||||
statis void do_signal(struct pt_regs *regs)
|
||||
static void do_signal(struct pt_regs *regs)
|
||||
{
|
||||
siginfo_t info;
|
||||
int signr;
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <linux/profile.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq_regs.h>
|
||||
#include <asm/timer.h>
|
||||
|
||||
#define TICK_SIZE (tick_nsec / 1000)
|
||||
|
@ -129,7 +129,7 @@ static int __devinit ltq_pci_startup(struct platform_device *pdev)
|
||||
|
||||
/* setup reset gpio used by pci */
|
||||
reset_gpio = of_get_named_gpio(node, "gpio-reset", 0);
|
||||
if (reset_gpio > 0)
|
||||
if (gpio_is_valid(reset_gpio))
|
||||
devm_gpio_request(&pdev->dev, reset_gpio, "pci-reset");
|
||||
|
||||
/* enable auto-switching between PCI and EBU */
|
||||
@ -192,7 +192,7 @@ static int __devinit ltq_pci_startup(struct platform_device *pdev)
|
||||
ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_IEN) | 0x10, LTQ_EBU_PCC_IEN);
|
||||
|
||||
/* toggle reset pin */
|
||||
if (reset_gpio > 0) {
|
||||
if (gpio_is_valid(reset_gpio)) {
|
||||
__gpio_set_value(reset_gpio, 0);
|
||||
wmb();
|
||||
mdelay(1);
|
||||
|
@ -81,9 +81,6 @@ struct pt_regs {
|
||||
#define PTRACE_GETFPREGS 14
|
||||
#define PTRACE_SETFPREGS 15
|
||||
|
||||
/* options set using PTRACE_SETOPTIONS */
|
||||
#define PTRACE_O_TRACESYSGOOD 0x00000001
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define user_mode(regs) (((regs)->epsw & EPSW_nSL) == EPSW_nSL)
|
||||
|
@ -123,7 +123,7 @@ static inline unsigned long current_stack_pointer(void)
|
||||
}
|
||||
|
||||
#ifndef CONFIG_KGDB
|
||||
void arch_release_thread_info(struct thread_info *ti)
|
||||
void arch_release_thread_info(struct thread_info *ti);
|
||||
#endif
|
||||
#define get_thread_info(ti) get_task_struct((ti)->task)
|
||||
#define put_thread_info(ti) put_task_struct((ti)->task)
|
||||
|
@ -11,7 +11,6 @@
|
||||
#ifndef _ASM_TIMEX_H
|
||||
#define _ASM_TIMEX_H
|
||||
|
||||
#include <asm/hardirq.h>
|
||||
#include <unit/timex.h>
|
||||
|
||||
#define TICK_SIZE (tick_nsec / 1000)
|
||||
@ -30,16 +29,6 @@ static inline cycles_t get_cycles(void)
|
||||
extern int init_clockevents(void);
|
||||
extern int init_clocksource(void);
|
||||
|
||||
static inline void setup_jiffies_interrupt(int irq,
|
||||
struct irqaction *action)
|
||||
{
|
||||
u16 tmp;
|
||||
setup_irq(irq, action);
|
||||
set_intr_level(irq, NUM2GxICR_LEVEL(CONFIG_TIMER_IRQ_LEVEL));
|
||||
GxICR(irq) |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST;
|
||||
tmp = GxICR(irq);
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _ASM_TIMEX_H */
|
||||
|
@ -70,6 +70,16 @@ static void event_handler(struct clock_event_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void setup_jiffies_interrupt(int irq,
|
||||
struct irqaction *action)
|
||||
{
|
||||
u16 tmp;
|
||||
setup_irq(irq, action);
|
||||
set_intr_level(irq, NUM2GxICR_LEVEL(CONFIG_TIMER_IRQ_LEVEL));
|
||||
GxICR(irq) |= GxICR_ENABLE | GxICR_DETECT | GxICR_REQUEST;
|
||||
tmp = GxICR(irq);
|
||||
}
|
||||
|
||||
int __init init_clockevents(void)
|
||||
{
|
||||
struct clock_event_device *cd;
|
||||
|
@ -9,6 +9,8 @@
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/irqreturn.h>
|
||||
|
||||
struct clocksource;
|
||||
struct clock_event_device;
|
||||
|
||||
|
@ -170,9 +170,9 @@ mn10300_cpupic_setaffinity(struct irq_data *d, const struct cpumask *mask,
|
||||
case SC1TXIRQ:
|
||||
#ifdef CONFIG_MN10300_TTYSM1_TIMER12
|
||||
case TM12IRQ:
|
||||
#elif CONFIG_MN10300_TTYSM1_TIMER9
|
||||
#elif defined(CONFIG_MN10300_TTYSM1_TIMER9)
|
||||
case TM9IRQ:
|
||||
#elif CONFIG_MN10300_TTYSM1_TIMER3
|
||||
#elif defined(CONFIG_MN10300_TTYSM1_TIMER3)
|
||||
case TM3IRQ:
|
||||
#endif /* CONFIG_MN10300_TTYSM1_TIMER12 */
|
||||
#endif /* CONFIG_MN10300_TTYSM1 */
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/processor.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static unsigned long pci_sram_allocated = 0xbc000000;
|
||||
|
@ -11,10 +11,6 @@
|
||||
#ifndef _ASM_UNIT_TIMEX_H
|
||||
#define _ASM_UNIT_TIMEX_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/irq.h>
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#include <asm/timer-regs.h>
|
||||
#include <unit/clock.h>
|
||||
#include <asm/param.h>
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/timex.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/intctl-regs.h>
|
||||
|
@ -11,10 +11,6 @@
|
||||
#ifndef _ASM_UNIT_TIMEX_H
|
||||
#define _ASM_UNIT_TIMEX_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/irq.h>
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#include <asm/timer-regs.h>
|
||||
#include <unit/clock.h>
|
||||
#include <asm/param.h>
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/intctl-regs.h>
|
||||
|
@ -11,10 +11,6 @@
|
||||
#ifndef _ASM_UNIT_TIMEX_H
|
||||
#define _ASM_UNIT_TIMEX_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/irq.h>
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#include <asm/timer-regs.h>
|
||||
#include <unit/clock.h>
|
||||
#include <asm/param.h>
|
||||
|
@ -86,8 +86,8 @@ static inline bool arch_irqs_disabled(void)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
#define __hard_irq_enable() asm volatile("wrteei 1" : : : "memory");
|
||||
#define __hard_irq_disable() asm volatile("wrteei 0" : : : "memory");
|
||||
#define __hard_irq_enable() asm volatile("wrteei 1" : : : "memory")
|
||||
#define __hard_irq_disable() asm volatile("wrteei 0" : : : "memory")
|
||||
#else
|
||||
#define __hard_irq_enable() __mtmsrd(local_paca->kernel_msr | MSR_EE, 1)
|
||||
#define __hard_irq_disable() __mtmsrd(local_paca->kernel_msr, 1)
|
||||
@ -125,6 +125,8 @@ static inline bool arch_irq_disabled_regs(struct pt_regs *regs)
|
||||
return !regs->softe;
|
||||
}
|
||||
|
||||
extern bool prep_irq_for_idle(void);
|
||||
|
||||
#else /* CONFIG_PPC64 */
|
||||
|
||||
#define SET_MSR_EE(x) mtmsr(x)
|
||||
|
@ -229,7 +229,7 @@ notrace void arch_local_irq_restore(unsigned long en)
|
||||
*/
|
||||
if (unlikely(irq_happened != PACA_IRQ_HARD_DIS))
|
||||
__hard_irq_disable();
|
||||
#ifdef CONFIG_TRACE_IRQFLAG
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
else {
|
||||
/*
|
||||
* We should already be hard disabled here. We had bugs
|
||||
@ -286,6 +286,52 @@ void notrace restore_interrupts(void)
|
||||
__hard_irq_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a helper to use when about to go into idle low-power
|
||||
* when the latter has the side effect of re-enabling interrupts
|
||||
* (such as calling H_CEDE under pHyp).
|
||||
*
|
||||
* You call this function with interrupts soft-disabled (this is
|
||||
* already the case when ppc_md.power_save is called). The function
|
||||
* will return whether to enter power save or just return.
|
||||
*
|
||||
* In the former case, it will have notified lockdep of interrupts
|
||||
* being re-enabled and generally sanitized the lazy irq state,
|
||||
* and in the latter case it will leave with interrupts hard
|
||||
* disabled and marked as such, so the local_irq_enable() call
|
||||
* in cpu_idle() will properly re-enable everything.
|
||||
*/
|
||||
bool prep_irq_for_idle(void)
|
||||
{
|
||||
/*
|
||||
* First we need to hard disable to ensure no interrupt
|
||||
* occurs before we effectively enter the low power state
|
||||
*/
|
||||
hard_irq_disable();
|
||||
|
||||
/*
|
||||
* If anything happened while we were soft-disabled,
|
||||
* we return now and do not enter the low power state.
|
||||
*/
|
||||
if (lazy_irq_pending())
|
||||
return false;
|
||||
|
||||
/* Tell lockdep we are about to re-enable */
|
||||
trace_hardirqs_on();
|
||||
|
||||
/*
|
||||
* Mark interrupts as soft-enabled and clear the
|
||||
* PACA_IRQ_HARD_DIS from the pending mask since we
|
||||
* are about to hard enable as well as a side effect
|
||||
* of entering the low power state.
|
||||
*/
|
||||
local_paca->irq_happened &= ~PACA_IRQ_HARD_DIS;
|
||||
local_paca->soft_enabled = 1;
|
||||
|
||||
/* Tell the caller to enter the low power state */
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
int arch_show_interrupts(struct seq_file *p, int prec)
|
||||
|
@ -241,6 +241,7 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
|
||||
case H_PUT_TCE:
|
||||
return kvmppc_h_pr_put_tce(vcpu);
|
||||
case H_CEDE:
|
||||
vcpu->arch.shared->msr |= MSR_EE;
|
||||
kvm_vcpu_block(vcpu);
|
||||
clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
|
||||
vcpu->stat.halt_wakeup++;
|
||||
|
@ -639,7 +639,7 @@ static void __init parse_drconf_memory(struct device_node *memory)
|
||||
unsigned int n, rc, ranges, is_kexec_kdump = 0;
|
||||
unsigned long lmb_size, base, size, sz;
|
||||
int nid;
|
||||
struct assoc_arrays aa;
|
||||
struct assoc_arrays aa = { .arrays = NULL };
|
||||
|
||||
n = of_get_drconf_memory(memory, &dm);
|
||||
if (!n)
|
||||
|
@ -42,11 +42,9 @@ static void cbe_power_save(void)
|
||||
{
|
||||
unsigned long ctrl, thread_switch_control;
|
||||
|
||||
/*
|
||||
* We need to hard disable interrupts, the local_irq_enable() done by
|
||||
* our caller upon return will hard re-enable.
|
||||
*/
|
||||
hard_irq_disable();
|
||||
/* Ensure our interrupt state is properly tracked */
|
||||
if (!prep_irq_for_idle())
|
||||
return;
|
||||
|
||||
ctrl = mfspr(SPRN_CTRLF);
|
||||
|
||||
@ -81,6 +79,9 @@ static void cbe_power_save(void)
|
||||
*/
|
||||
ctrl &= ~(CTRL_RUNLATCH | CTRL_TE);
|
||||
mtspr(SPRN_CTRLT, ctrl);
|
||||
|
||||
/* Re-enable interrupts in MSR */
|
||||
__hard_irq_enable();
|
||||
}
|
||||
|
||||
static int cbe_system_reset_exception(struct pt_regs *regs)
|
||||
|
@ -99,15 +99,18 @@ out:
|
||||
static void check_and_cede_processor(void)
|
||||
{
|
||||
/*
|
||||
* Interrupts are soft-disabled at this point,
|
||||
* but not hard disabled. So an interrupt might have
|
||||
* occurred before entering NAP, and would be potentially
|
||||
* lost (edge events, decrementer events, etc...) unless
|
||||
* we first hard disable then check.
|
||||
* Ensure our interrupt state is properly tracked,
|
||||
* also checks if no interrupt has occurred while we
|
||||
* were soft-disabled
|
||||
*/
|
||||
hard_irq_disable();
|
||||
if (!lazy_irq_pending())
|
||||
if (prep_irq_for_idle()) {
|
||||
cede_processor();
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
/* Ensure that H_CEDE returns with IRQs on */
|
||||
if (WARN_ON(!(mfmsr() & MSR_EE)))
|
||||
__hard_irq_enable();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static int dedicated_cede_loop(struct cpuidle_device *dev,
|
||||
|
@ -19,9 +19,20 @@ static inline u32 inl(unsigned long addr)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define outb(x, y) BUG()
|
||||
#define outw(x, y) BUG()
|
||||
#define outl(x, y) BUG()
|
||||
static inline void outb(unsigned char x, unsigned long port)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void outw(unsigned short x, unsigned long port)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
static inline void outl(unsigned int x, unsigned long port)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
|
||||
#define inb_p(addr) inb(addr)
|
||||
#define inw_p(addr) inw(addr)
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/io.h>
|
||||
#include <cpu/serial.h>
|
||||
#include <asm/gpio.h>
|
||||
#include <cpu/gpio.h>
|
||||
|
||||
static void sh7720_sci_init_pins(struct uart_port *port, unsigned int cflag)
|
||||
{
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/backtrace.h>
|
||||
#include <asm/tile-desc.h>
|
||||
#include <arch/abi.h>
|
||||
@ -336,8 +337,12 @@ static void find_caller_pc_and_caller_sp(CallerLocation *location,
|
||||
bytes_to_prefetch / sizeof(tile_bundle_bits);
|
||||
}
|
||||
|
||||
/* Decode the next bundle. */
|
||||
bundle.bits = prefetched_bundles[next_bundle++];
|
||||
/*
|
||||
* Decode the next bundle.
|
||||
* TILE always stores instruction bundles in little-endian
|
||||
* mode, even when the chip is running in big-endian mode.
|
||||
*/
|
||||
bundle.bits = le64_to_cpu(prefetched_bundles[next_bundle++]);
|
||||
bundle.num_insns =
|
||||
parse_insn_tile(bundle.bits, pc, bundle.insns);
|
||||
num_info_ops = bt_get_info_ops(&bundle, info_operands);
|
||||
|
@ -705,7 +705,6 @@ static void stack_proc(void *arg)
|
||||
struct task_struct *from = current, *to = arg;
|
||||
|
||||
to->thread.saved_task = from;
|
||||
rcu_switch_from(from);
|
||||
switch_to(from, to, from);
|
||||
}
|
||||
|
||||
|
@ -139,6 +139,19 @@ static int addr_to_vsyscall_nr(unsigned long addr)
|
||||
return nr;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SECCOMP
|
||||
static int vsyscall_seccomp(struct task_struct *tsk, int syscall_nr)
|
||||
{
|
||||
if (!seccomp_mode(&tsk->seccomp))
|
||||
return 0;
|
||||
task_pt_regs(tsk)->orig_ax = syscall_nr;
|
||||
task_pt_regs(tsk)->ax = syscall_nr;
|
||||
return __secure_computing(syscall_nr);
|
||||
}
|
||||
#else
|
||||
#define vsyscall_seccomp(_tsk, _nr) 0
|
||||
#endif
|
||||
|
||||
static bool write_ok_or_segv(unsigned long ptr, size_t size)
|
||||
{
|
||||
/*
|
||||
@ -174,6 +187,7 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
|
||||
int vsyscall_nr;
|
||||
int prev_sig_on_uaccess_error;
|
||||
long ret;
|
||||
int skip;
|
||||
|
||||
/*
|
||||
* No point in checking CS -- the only way to get here is a user mode
|
||||
@ -205,9 +219,6 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
|
||||
}
|
||||
|
||||
tsk = current;
|
||||
if (seccomp_mode(&tsk->seccomp))
|
||||
do_exit(SIGKILL);
|
||||
|
||||
/*
|
||||
* With a real vsyscall, page faults cause SIGSEGV. We want to
|
||||
* preserve that behavior to make writing exploits harder.
|
||||
@ -222,8 +233,13 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
|
||||
* address 0".
|
||||
*/
|
||||
ret = -EFAULT;
|
||||
skip = 0;
|
||||
switch (vsyscall_nr) {
|
||||
case 0:
|
||||
skip = vsyscall_seccomp(tsk, __NR_gettimeofday);
|
||||
if (skip)
|
||||
break;
|
||||
|
||||
if (!write_ok_or_segv(regs->di, sizeof(struct timeval)) ||
|
||||
!write_ok_or_segv(regs->si, sizeof(struct timezone)))
|
||||
break;
|
||||
@ -234,6 +250,10 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
|
||||
break;
|
||||
|
||||
case 1:
|
||||
skip = vsyscall_seccomp(tsk, __NR_time);
|
||||
if (skip)
|
||||
break;
|
||||
|
||||
if (!write_ok_or_segv(regs->di, sizeof(time_t)))
|
||||
break;
|
||||
|
||||
@ -241,6 +261,10 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
|
||||
break;
|
||||
|
||||
case 2:
|
||||
skip = vsyscall_seccomp(tsk, __NR_getcpu);
|
||||
if (skip)
|
||||
break;
|
||||
|
||||
if (!write_ok_or_segv(regs->di, sizeof(unsigned)) ||
|
||||
!write_ok_or_segv(regs->si, sizeof(unsigned)))
|
||||
break;
|
||||
@ -253,6 +277,12 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
|
||||
|
||||
current_thread_info()->sig_on_uaccess_error = prev_sig_on_uaccess_error;
|
||||
|
||||
if (skip) {
|
||||
if ((long)regs->ax <= 0L) /* seccomp errno emulation */
|
||||
goto do_ret;
|
||||
goto done; /* seccomp trace/trap */
|
||||
}
|
||||
|
||||
if (ret == -EFAULT) {
|
||||
/* Bad news -- userspace fed a bad pointer to a vsyscall. */
|
||||
warn_bad_vsyscall(KERN_INFO, regs,
|
||||
@ -271,10 +301,11 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
|
||||
|
||||
regs->ax = ret;
|
||||
|
||||
do_ret:
|
||||
/* Emulate a ret instruction. */
|
||||
regs->ip = caller;
|
||||
regs->sp += 8;
|
||||
|
||||
done:
|
||||
return true;
|
||||
|
||||
sigsegv:
|
||||
|
@ -277,7 +277,7 @@ void xtensa_elf_core_copy_regs (xtensa_gregset_t *elfregs, struct pt_regs *regs)
|
||||
|
||||
/* Don't leak any random bits. */
|
||||
|
||||
memset(elfregs, 0, sizeof (elfregs));
|
||||
memset(elfregs, 0, sizeof(*elfregs));
|
||||
|
||||
/* Note: PS.EXCM is not set while user task is running; its
|
||||
* being set in regs->ps is for exception handling convenience.
|
||||
|
@ -95,18 +95,6 @@ acpi_status acpi_hw_legacy_sleep(u8 sleep_state, u8 flags)
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (sleep_state != ACPI_STATE_S5) {
|
||||
/*
|
||||
* Disable BM arbitration. This feature is contained within an
|
||||
* optional register (PM2 Control), so ignore a BAD_ADDRESS
|
||||
* exception.
|
||||
*/
|
||||
status = acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 1);
|
||||
if (ACPI_FAILURE(status) && (status != AE_BAD_ADDRESS)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 1) Disable/Clear all GPEs
|
||||
* 2) Enable all wakeup GPEs
|
||||
@ -364,16 +352,6 @@ acpi_status acpi_hw_legacy_wake(u8 sleep_state, u8 flags)
|
||||
[ACPI_EVENT_POWER_BUTTON].
|
||||
status_register_id, ACPI_CLEAR_STATUS);
|
||||
|
||||
/*
|
||||
* Enable BM arbitration. This feature is contained within an
|
||||
* optional register (PM2 Control), so ignore a BAD_ADDRESS
|
||||
* exception.
|
||||
*/
|
||||
status = acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 0);
|
||||
if (ACPI_FAILURE(status) && (status != AE_BAD_ADDRESS)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
acpi_hw_execute_sleep_method(METHOD_PATHNAME__SST, ACPI_SST_WORKING);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -638,7 +638,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
||||
/* Create the new outer package and populate it */
|
||||
|
||||
status =
|
||||
acpi_ns_wrap_with_package(data, *elements,
|
||||
acpi_ns_wrap_with_package(data, return_object,
|
||||
return_object_ptr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
|
@ -189,10 +189,12 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id)
|
||||
* Processor (CPU3, 0x03, 0x00000410, 0x06) {}
|
||||
* }
|
||||
*
|
||||
* Ignores apic_id and always return 0 for CPU0's handle.
|
||||
* Ignores apic_id and always returns 0 for the processor
|
||||
* handle with acpi id 0 if nr_cpu_ids is 1.
|
||||
* This should be the case if SMP tables are not found.
|
||||
* Return -1 for other CPU's handle.
|
||||
*/
|
||||
if (acpi_id == 0)
|
||||
if (nr_cpu_ids <= 1 && acpi_id == 0)
|
||||
return acpi_id;
|
||||
else
|
||||
return apic_id;
|
||||
|
@ -1597,14 +1597,12 @@ static int loop_add(struct loop_device **l, int i)
|
||||
struct gendisk *disk;
|
||||
int err;
|
||||
|
||||
err = -ENOMEM;
|
||||
lo = kzalloc(sizeof(*lo), GFP_KERNEL);
|
||||
if (!lo) {
|
||||
err = -ENOMEM;
|
||||
if (!lo)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = idr_pre_get(&loop_index_idr, GFP_KERNEL);
|
||||
if (err < 0)
|
||||
if (!idr_pre_get(&loop_index_idr, GFP_KERNEL))
|
||||
goto out_free_dev;
|
||||
|
||||
if (i >= 0) {
|
||||
|
@ -136,7 +136,7 @@ config GPIO_MPC8XXX
|
||||
|
||||
config GPIO_MSM_V1
|
||||
tristate "Qualcomm MSM GPIO v1"
|
||||
depends on GPIOLIB && ARCH_MSM
|
||||
depends on GPIOLIB && ARCH_MSM && (ARCH_MSM7X00A || ARCH_MSM7X30 || ARCH_QSD8X50)
|
||||
help
|
||||
Say yes here to support the GPIO interface on ARM v6 based
|
||||
Qualcomm MSM chips. Most of the pins on the MSM can be
|
||||
|
@ -98,6 +98,7 @@ int devm_gpio_request_one(struct device *dev, unsigned gpio,
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(devm_gpio_request_one);
|
||||
|
||||
/**
|
||||
* devm_gpio_free - free an interrupt
|
||||
|
@ -398,10 +398,12 @@ static int __devinit mxc_gpio_probe(struct platform_device *pdev)
|
||||
writel(~0, port->base + GPIO_ISR);
|
||||
|
||||
if (mxc_gpio_hwtype == IMX21_GPIO) {
|
||||
/* setup one handler for all GPIO interrupts */
|
||||
if (pdev->id == 0)
|
||||
irq_set_chained_handler(port->irq,
|
||||
mx2_gpio_irq_handler);
|
||||
/*
|
||||
* Setup one handler for all GPIO interrupts. Actually setting
|
||||
* the handler is needed only once, but doing it for every port
|
||||
* is more robust and easier.
|
||||
*/
|
||||
irq_set_chained_handler(port->irq, mx2_gpio_irq_handler);
|
||||
} else {
|
||||
/* setup one handler for each entry */
|
||||
irq_set_chained_handler(port->irq, mx3_gpio_irq_handler);
|
||||
|
@ -174,12 +174,22 @@ static inline void _gpio_dbck_enable(struct gpio_bank *bank)
|
||||
if (bank->dbck_enable_mask && !bank->dbck_enabled) {
|
||||
clk_enable(bank->dbck);
|
||||
bank->dbck_enabled = true;
|
||||
|
||||
__raw_writel(bank->dbck_enable_mask,
|
||||
bank->base + bank->regs->debounce_en);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void _gpio_dbck_disable(struct gpio_bank *bank)
|
||||
{
|
||||
if (bank->dbck_enable_mask && bank->dbck_enabled) {
|
||||
/*
|
||||
* Disable debounce before cutting it's clock. If debounce is
|
||||
* enabled but the clock is not, GPIO module seems to be unable
|
||||
* to detect events and generate interrupts at least on OMAP3.
|
||||
*/
|
||||
__raw_writel(0, bank->base + bank->regs->debounce_en);
|
||||
|
||||
clk_disable(bank->dbck);
|
||||
bank->dbck_enabled = false;
|
||||
}
|
||||
@ -1081,7 +1091,6 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
|
||||
bank->is_mpuio = pdata->is_mpuio;
|
||||
bank->non_wakeup_gpios = pdata->non_wakeup_gpios;
|
||||
bank->loses_context = pdata->loses_context;
|
||||
bank->get_context_loss_count = pdata->get_context_loss_count;
|
||||
bank->regs = pdata->regs;
|
||||
#ifdef CONFIG_OF_GPIO
|
||||
bank->chip.of_node = of_node_get(node);
|
||||
@ -1135,6 +1144,9 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)
|
||||
omap_gpio_chip_init(bank);
|
||||
omap_gpio_show_rev(bank);
|
||||
|
||||
if (bank->loses_context)
|
||||
bank->get_context_loss_count = pdata->get_context_loss_count;
|
||||
|
||||
pm_runtime_put(bank->dev);
|
||||
|
||||
list_add_tail(&bank->node, &omap_gpio_list);
|
||||
|
@ -383,8 +383,9 @@ static int __devinit gsta_probe(struct platform_device *dev)
|
||||
}
|
||||
spin_lock_init(&chip->lock);
|
||||
gsta_gpio_setup(chip);
|
||||
for (i = 0; i < GSTA_NR_GPIO; i++)
|
||||
gsta_set_config(chip, i, gpio_pdata->pinconfig[i]);
|
||||
if (gpio_pdata)
|
||||
for (i = 0; i < GSTA_NR_GPIO; i++)
|
||||
gsta_set_config(chip, i, gpio_pdata->pinconfig[i]);
|
||||
|
||||
/* 384 was used in previous code: be compatible for other drivers */
|
||||
err = irq_alloc_descs(-1, 384, GSTA_NR_GPIO, NUMA_NO_NODE);
|
||||
|
@ -149,6 +149,9 @@ static int __devinit tps65910_gpio_probe(struct platform_device *pdev)
|
||||
tps65910_gpio->gpio_chip.set = tps65910_gpio_set;
|
||||
tps65910_gpio->gpio_chip.get = tps65910_gpio_get;
|
||||
tps65910_gpio->gpio_chip.dev = &pdev->dev;
|
||||
#ifdef CONFIG_OF_GPIO
|
||||
tps65910_gpio->gpio_chip.of_node = tps65910->dev->of_node;
|
||||
#endif
|
||||
if (pdata && pdata->gpio_base)
|
||||
tps65910_gpio->gpio_chip.base = pdata->gpio_base;
|
||||
else
|
||||
|
@ -89,8 +89,11 @@ static int wm8994_gpio_direction_out(struct gpio_chip *chip,
|
||||
struct wm8994_gpio *wm8994_gpio = to_wm8994_gpio(chip);
|
||||
struct wm8994 *wm8994 = wm8994_gpio->wm8994;
|
||||
|
||||
if (value)
|
||||
value = WM8994_GPN_LVL;
|
||||
|
||||
return wm8994_set_bits(wm8994, WM8994_GPIO_1 + offset,
|
||||
WM8994_GPN_DIR, 0);
|
||||
WM8994_GPN_DIR | WM8994_GPN_LVL, value);
|
||||
}
|
||||
|
||||
static void wm8994_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
|
@ -517,6 +517,12 @@ static const struct hid_device_id apple_devices[] = {
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI),
|
||||
.driver_data = APPLE_HAS_FN },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
|
||||
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
|
||||
|
@ -1503,6 +1503,9 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
|
||||
@ -1995,6 +1998,7 @@ static const struct hid_device_id hid_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_BEATPAD) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) },
|
||||
@ -2089,6 +2093,9 @@ static const struct hid_device_id hid_mouse_ignore_list[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
|
||||
{ }
|
||||
|
@ -125,6 +125,9 @@
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264
|
||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239
|
||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a
|
||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
|
||||
@ -518,6 +521,9 @@
|
||||
#define USB_DEVICE_ID_CRYSTALTOUCH 0x0006
|
||||
#define USB_DEVICE_ID_CRYSTALTOUCH_DUAL 0x0007
|
||||
|
||||
#define USB_VENDOR_ID_MADCATZ 0x0738
|
||||
#define USB_DEVICE_ID_MADCATZ_BEATPAD 0x4540
|
||||
|
||||
#define USB_VENDOR_ID_MCC 0x09db
|
||||
#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076
|
||||
#define USB_DEVICE_ID_MCC_PMD1208LS 0x007a
|
||||
|
@ -2341,7 +2341,7 @@ static void __devinit it87_init_device(struct platform_device *pdev)
|
||||
|
||||
/* Start monitoring */
|
||||
it87_write_value(data, IT87_REG_CONFIG,
|
||||
(it87_read_value(data, IT87_REG_CONFIG) & 0x36)
|
||||
(it87_read_value(data, IT87_REG_CONFIG) & 0x3e)
|
||||
| (update_vbat ? 0x41 : 0x01));
|
||||
}
|
||||
|
||||
|
@ -345,7 +345,7 @@ int hwspin_lock_register(struct hwspinlock_device *bank, struct device *dev,
|
||||
spin_lock_init(&hwlock->lock);
|
||||
hwlock->bank = bank;
|
||||
|
||||
ret = hwspin_lock_register_single(hwlock, i);
|
||||
ret = hwspin_lock_register_single(hwlock, base_id + i);
|
||||
if (ret)
|
||||
goto reg_failed;
|
||||
}
|
||||
@ -354,7 +354,7 @@ int hwspin_lock_register(struct hwspinlock_device *bank, struct device *dev,
|
||||
|
||||
reg_failed:
|
||||
while (--i >= 0)
|
||||
hwspin_lock_unregister_single(i);
|
||||
hwspin_lock_unregister_single(base_id + i);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hwspin_lock_register);
|
||||
|
@ -142,6 +142,7 @@ static const struct xpad_device {
|
||||
{ 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX },
|
||||
{ 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX },
|
||||
{ 0x0d2f, 0x0002, "Andamiro Pump It Up pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX },
|
||||
{ 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX },
|
||||
@ -164,6 +165,7 @@ static const struct xpad_device {
|
||||
{ 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 },
|
||||
{ 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN }
|
||||
};
|
||||
@ -238,12 +240,14 @@ static struct usb_device_id xpad_table [] = {
|
||||
XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */
|
||||
XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */
|
||||
XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */
|
||||
{ USB_DEVICE(0x0738, 0x4540) }, /* Mad Catz Beat Pad */
|
||||
XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */
|
||||
XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */
|
||||
XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */
|
||||
XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */
|
||||
XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */
|
||||
XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */
|
||||
XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */
|
||||
XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */
|
||||
{ }
|
||||
};
|
||||
|
||||
|
@ -79,6 +79,10 @@
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254
|
||||
/* MacbookPro10,1 (unibody, June 2012) */
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264
|
||||
|
||||
#define BCM5974_DEVICE(prod) { \
|
||||
.match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \
|
||||
@ -128,6 +132,10 @@ static const struct usb_device_id bcm5974_table[] = {
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS),
|
||||
/* MacbookPro10,1 */
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ISO),
|
||||
BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_JIS),
|
||||
/* Terminating entry */
|
||||
{}
|
||||
};
|
||||
@ -354,6 +362,18 @@ static const struct bcm5974_config bcm5974_config_table[] = {
|
||||
{ DIM_X, DIM_X / SN_COORD, -4620, 5140 },
|
||||
{ DIM_Y, DIM_Y / SN_COORD, -150, 6600 }
|
||||
},
|
||||
{
|
||||
USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI,
|
||||
USB_DEVICE_ID_APPLE_WELLSPRING7_ISO,
|
||||
USB_DEVICE_ID_APPLE_WELLSPRING7_JIS,
|
||||
HAS_INTEGRATED_BUTTON,
|
||||
0x84, sizeof(struct bt_data),
|
||||
0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS,
|
||||
{ DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 300 },
|
||||
{ DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 },
|
||||
{ DIM_X, DIM_X / SN_COORD, -4750, 5280 },
|
||||
{ DIM_Y, DIM_Y / SN_COORD, -150, 6730 }
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -83,6 +83,8 @@ static struct iommu_ops amd_iommu_ops;
|
||||
static ATOMIC_NOTIFIER_HEAD(ppr_notifier);
|
||||
int amd_iommu_max_glx_val = -1;
|
||||
|
||||
static struct dma_map_ops amd_iommu_dma_ops;
|
||||
|
||||
/*
|
||||
* general struct to manage commands send to an IOMMU
|
||||
*/
|
||||
@ -402,7 +404,7 @@ static void amd_iommu_stats_init(void)
|
||||
return;
|
||||
|
||||
de_fflush = debugfs_create_bool("fullflush", 0444, stats_dir,
|
||||
(u32 *)&amd_iommu_unmap_flush);
|
||||
&amd_iommu_unmap_flush);
|
||||
|
||||
amd_iommu_stats_add(&compl_wait);
|
||||
amd_iommu_stats_add(&cnt_map_single);
|
||||
@ -2267,6 +2269,13 @@ static int device_change_notifier(struct notifier_block *nb,
|
||||
list_add_tail(&dma_domain->list, &iommu_pd_list);
|
||||
spin_unlock_irqrestore(&iommu_pd_list_lock, flags);
|
||||
|
||||
dev_data = get_dev_data(dev);
|
||||
|
||||
if (!dev_data->passthrough)
|
||||
dev->archdata.dma_ops = &amd_iommu_dma_ops;
|
||||
else
|
||||
dev->archdata.dma_ops = &nommu_dma_ops;
|
||||
|
||||
break;
|
||||
case BUS_NOTIFY_DEL_DEVICE:
|
||||
|
||||
|
@ -129,7 +129,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have
|
||||
to handle */
|
||||
LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings
|
||||
we find in ACPI */
|
||||
bool amd_iommu_unmap_flush; /* if true, flush on every unmap */
|
||||
u32 amd_iommu_unmap_flush; /* if true, flush on every unmap */
|
||||
|
||||
LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the
|
||||
system */
|
||||
@ -1641,6 +1641,8 @@ static int __init amd_iommu_init(void)
|
||||
|
||||
amd_iommu_init_api();
|
||||
|
||||
x86_platform.iommu_shutdown = disable_iommus;
|
||||
|
||||
if (iommu_pass_through)
|
||||
goto out;
|
||||
|
||||
@ -1649,8 +1651,6 @@ static int __init amd_iommu_init(void)
|
||||
else
|
||||
printk(KERN_INFO "AMD-Vi: Lazy IO/TLB flushing enabled\n");
|
||||
|
||||
x86_platform.iommu_shutdown = disable_iommus;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
||||
|
@ -652,7 +652,7 @@ extern unsigned long *amd_iommu_pd_alloc_bitmap;
|
||||
* If true, the addresses will be flushed on unmap time, not when
|
||||
* they are reused
|
||||
*/
|
||||
extern bool amd_iommu_unmap_flush;
|
||||
extern u32 amd_iommu_unmap_flush;
|
||||
|
||||
/* Smallest number of PASIDs supported by any IOMMU in the system */
|
||||
extern u32 amd_iommu_max_pasids;
|
||||
|
@ -550,13 +550,13 @@ static int alloc_pdir(struct smmu_as *as)
|
||||
return 0;
|
||||
|
||||
as->pte_count = devm_kzalloc(smmu->dev,
|
||||
sizeof(as->pte_count[0]) * SMMU_PDIR_COUNT, GFP_KERNEL);
|
||||
sizeof(as->pte_count[0]) * SMMU_PDIR_COUNT, GFP_ATOMIC);
|
||||
if (!as->pte_count) {
|
||||
dev_err(smmu->dev,
|
||||
"failed to allocate smmu_device PTE cunters\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
as->pdir_page = alloc_page(GFP_KERNEL | __GFP_DMA);
|
||||
as->pdir_page = alloc_page(GFP_ATOMIC | __GFP_DMA);
|
||||
if (!as->pdir_page) {
|
||||
dev_err(smmu->dev,
|
||||
"failed to allocate smmu_device page directory\n");
|
||||
|
@ -2485,9 +2485,10 @@ static sector_t sync_request(struct mddev *mddev, sector_t sector_nr, int *skipp
|
||||
*/
|
||||
if (test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
|
||||
atomic_set(&r1_bio->remaining, read_targets);
|
||||
for (i = 0; i < conf->raid_disks * 2; i++) {
|
||||
for (i = 0; i < conf->raid_disks * 2 && read_targets; i++) {
|
||||
bio = r1_bio->bios[i];
|
||||
if (bio->bi_end_io == end_sync_read) {
|
||||
read_targets--;
|
||||
md_sync_acct(bio->bi_bdev, nr_sectors);
|
||||
generic_make_request(bio);
|
||||
}
|
||||
|
@ -243,6 +243,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
if (minor == MAX_DVB_MINORS) {
|
||||
kfree(dvbdevfops);
|
||||
kfree(dvbdev);
|
||||
up_write(&minor_rwsem);
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -232,7 +232,7 @@ MODULE_PARM_DESC(invert, "Invert the signal from the IR receiver");
|
||||
|
||||
static bool txandrx; /* default = 0 */
|
||||
module_param(txandrx, bool, 0444);
|
||||
MODULE_PARM_DESC(invert, "Allow simultaneous TX and RX");
|
||||
MODULE_PARM_DESC(txandrx, "Allow simultaneous TX and RX");
|
||||
|
||||
static unsigned int wake_sc = 0x800F040C;
|
||||
module_param(wake_sc, uint, 0644);
|
||||
@ -1032,6 +1032,8 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
|
||||
data->dev->tx_ir = wbcir_tx;
|
||||
data->dev->priv = data;
|
||||
data->dev->dev.parent = &device->dev;
|
||||
data->dev->timeout = MS_TO_NS(100);
|
||||
data->dev->allowed_protos = RC_TYPE_ALL;
|
||||
|
||||
if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) {
|
||||
dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
|
||||
|
@ -307,7 +307,7 @@ static int cx231xx_init_audio_isoc(struct cx231xx *dev)
|
||||
urb->context = dev;
|
||||
urb->pipe = usb_rcvisocpipe(dev->udev,
|
||||
dev->adev.end_point_addr);
|
||||
urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
|
||||
urb->transfer_flags = URB_ISO_ASAP;
|
||||
urb->transfer_buffer = dev->adev.transfer_buffer[i];
|
||||
urb->interval = 1;
|
||||
urb->complete = cx231xx_audio_isocirq;
|
||||
@ -368,7 +368,7 @@ static int cx231xx_init_audio_bulk(struct cx231xx *dev)
|
||||
urb->context = dev;
|
||||
urb->pipe = usb_rcvbulkpipe(dev->udev,
|
||||
dev->adev.end_point_addr);
|
||||
urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
|
||||
urb->transfer_flags = 0;
|
||||
urb->transfer_buffer = dev->adev.transfer_buffer[i];
|
||||
urb->complete = cx231xx_audio_bulkirq;
|
||||
urb->transfer_buffer_length = sb_size;
|
||||
|
@ -448,7 +448,7 @@ int cx231xx_init_vbi_isoc(struct cx231xx *dev, int max_packets,
|
||||
return -ENOMEM;
|
||||
}
|
||||
dev->vbi_mode.bulk_ctl.urb[i] = urb;
|
||||
urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
|
||||
urb->transfer_flags = 0;
|
||||
|
||||
dev->vbi_mode.bulk_ctl.transfer_buffer[i] =
|
||||
kzalloc(sb_size, GFP_KERNEL);
|
||||
|
@ -127,22 +127,37 @@ struct cx23885_board cx23885_boards[] = {
|
||||
},
|
||||
[CX23885_BOARD_HAUPPAUGE_HVR1250] = {
|
||||
.name = "Hauppauge WinTV-HVR1250",
|
||||
.porta = CX23885_ANALOG_VIDEO,
|
||||
.portc = CX23885_MPEG_DVB,
|
||||
#ifdef MT2131_NO_ANALOG_SUPPORT_YET
|
||||
.tuner_type = TUNER_PHILIPS_TDA8290,
|
||||
.tuner_addr = 0x42, /* 0x84 >> 1 */
|
||||
.tuner_bus = 1,
|
||||
#endif
|
||||
.force_bff = 1,
|
||||
.input = {{
|
||||
#ifdef MT2131_NO_ANALOG_SUPPORT_YET
|
||||
.type = CX23885_VMUX_TELEVISION,
|
||||
.vmux = 0,
|
||||
.vmux = CX25840_VIN7_CH3 |
|
||||
CX25840_VIN5_CH2 |
|
||||
CX25840_VIN2_CH1,
|
||||
.amux = CX25840_AUDIO8,
|
||||
.gpio0 = 0xff00,
|
||||
}, {
|
||||
.type = CX23885_VMUX_DEBUG,
|
||||
.vmux = 0,
|
||||
.gpio0 = 0xff01,
|
||||
}, {
|
||||
#endif
|
||||
.type = CX23885_VMUX_COMPOSITE1,
|
||||
.vmux = 1,
|
||||
.vmux = CX25840_VIN7_CH3 |
|
||||
CX25840_VIN4_CH2 |
|
||||
CX25840_VIN6_CH1,
|
||||
.amux = CX25840_AUDIO7,
|
||||
.gpio0 = 0xff02,
|
||||
}, {
|
||||
.type = CX23885_VMUX_SVIDEO,
|
||||
.vmux = 2,
|
||||
.vmux = CX25840_VIN7_CH3 |
|
||||
CX25840_VIN4_CH2 |
|
||||
CX25840_VIN8_CH1 |
|
||||
CX25840_SVIDEO_ON,
|
||||
.amux = CX25840_AUDIO7,
|
||||
.gpio0 = 0xff02,
|
||||
} },
|
||||
},
|
||||
@ -267,7 +282,55 @@ struct cx23885_board cx23885_boards[] = {
|
||||
},
|
||||
[CX23885_BOARD_HAUPPAUGE_HVR1255] = {
|
||||
.name = "Hauppauge WinTV-HVR1255",
|
||||
.porta = CX23885_ANALOG_VIDEO,
|
||||
.portc = CX23885_MPEG_DVB,
|
||||
.tuner_type = TUNER_ABSENT,
|
||||
.tuner_addr = 0x42, /* 0x84 >> 1 */
|
||||
.force_bff = 1,
|
||||
.input = {{
|
||||
.type = CX23885_VMUX_TELEVISION,
|
||||
.vmux = CX25840_VIN7_CH3 |
|
||||
CX25840_VIN5_CH2 |
|
||||
CX25840_VIN2_CH1 |
|
||||
CX25840_DIF_ON,
|
||||
.amux = CX25840_AUDIO8,
|
||||
}, {
|
||||
.type = CX23885_VMUX_COMPOSITE1,
|
||||
.vmux = CX25840_VIN7_CH3 |
|
||||
CX25840_VIN4_CH2 |
|
||||
CX25840_VIN6_CH1,
|
||||
.amux = CX25840_AUDIO7,
|
||||
}, {
|
||||
.type = CX23885_VMUX_SVIDEO,
|
||||
.vmux = CX25840_VIN7_CH3 |
|
||||
CX25840_VIN4_CH2 |
|
||||
CX25840_VIN8_CH1 |
|
||||
CX25840_SVIDEO_ON,
|
||||
.amux = CX25840_AUDIO7,
|
||||
} },
|
||||
},
|
||||
[CX23885_BOARD_HAUPPAUGE_HVR1255_22111] = {
|
||||
.name = "Hauppauge WinTV-HVR1255",
|
||||
.porta = CX23885_ANALOG_VIDEO,
|
||||
.portc = CX23885_MPEG_DVB,
|
||||
.tuner_type = TUNER_ABSENT,
|
||||
.tuner_addr = 0x42, /* 0x84 >> 1 */
|
||||
.force_bff = 1,
|
||||
.input = {{
|
||||
.type = CX23885_VMUX_TELEVISION,
|
||||
.vmux = CX25840_VIN7_CH3 |
|
||||
CX25840_VIN5_CH2 |
|
||||
CX25840_VIN2_CH1 |
|
||||
CX25840_DIF_ON,
|
||||
.amux = CX25840_AUDIO8,
|
||||
}, {
|
||||
.type = CX23885_VMUX_SVIDEO,
|
||||
.vmux = CX25840_VIN7_CH3 |
|
||||
CX25840_VIN4_CH2 |
|
||||
CX25840_VIN8_CH1 |
|
||||
CX25840_SVIDEO_ON,
|
||||
.amux = CX25840_AUDIO7,
|
||||
} },
|
||||
},
|
||||
[CX23885_BOARD_HAUPPAUGE_HVR1210] = {
|
||||
.name = "Hauppauge WinTV-HVR1210",
|
||||
@ -624,7 +687,7 @@ struct cx23885_subid cx23885_subids[] = {
|
||||
}, {
|
||||
.subvendor = 0x0070,
|
||||
.subdevice = 0x2259,
|
||||
.card = CX23885_BOARD_HAUPPAUGE_HVR1255,
|
||||
.card = CX23885_BOARD_HAUPPAUGE_HVR1255_22111,
|
||||
}, {
|
||||
.subvendor = 0x0070,
|
||||
.subdevice = 0x2291,
|
||||
@ -900,7 +963,7 @@ int cx23885_tuner_callback(void *priv, int component, int command, int arg)
|
||||
struct cx23885_dev *dev = port->dev;
|
||||
u32 bitmask = 0;
|
||||
|
||||
if (command == XC2028_RESET_CLK)
|
||||
if ((command == XC2028_RESET_CLK) || (command == XC2028_I2C_FLUSH))
|
||||
return 0;
|
||||
|
||||
if (command != 0) {
|
||||
@ -1130,6 +1193,7 @@ void cx23885_gpio_setup(struct cx23885_dev *dev)
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1270:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1275:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1210:
|
||||
/* GPIO-5 RF Control: 0 = RF1 Terrestrial, 1 = RF2 Cable */
|
||||
/* GPIO-6 I2C Gate which can isolate the demod from the bus */
|
||||
@ -1267,6 +1331,7 @@ int cx23885_ir_init(struct cx23885_dev *dev)
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1400:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1275:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1210:
|
||||
/* FIXME: Implement me */
|
||||
break;
|
||||
@ -1424,6 +1489,7 @@ void cx23885_card_setup(struct cx23885_dev *dev)
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1270:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1275:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1210:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1850:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1290:
|
||||
@ -1511,6 +1577,7 @@ void cx23885_card_setup(struct cx23885_dev *dev)
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1270:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1275:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1210:
|
||||
case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1290:
|
||||
@ -1526,10 +1593,10 @@ void cx23885_card_setup(struct cx23885_dev *dev)
|
||||
*/
|
||||
switch (dev->board) {
|
||||
case CX23885_BOARD_TEVII_S470:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1250:
|
||||
/* Currently only enabled for the integrated IR controller */
|
||||
if (!enable_885_ir)
|
||||
break;
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1250:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1800:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1700:
|
||||
@ -1539,6 +1606,8 @@ void cx23885_card_setup(struct cx23885_dev *dev)
|
||||
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
|
||||
case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
|
||||
case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1270:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1850:
|
||||
case CX23885_BOARD_MYGICA_X8506:
|
||||
|
@ -712,6 +712,7 @@ static int dvb_register(struct cx23885_tsport *port)
|
||||
}
|
||||
break;
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
|
||||
i2c_bus = &dev->i2c_bus[0];
|
||||
fe0->dvb.frontend = dvb_attach(s5h1411_attach,
|
||||
&hcw_s5h1411_config,
|
||||
@ -721,6 +722,11 @@ static int dvb_register(struct cx23885_tsport *port)
|
||||
0x60, &dev->i2c_bus[1].i2c_adap,
|
||||
&hauppauge_tda18271_config);
|
||||
}
|
||||
|
||||
tda18271_attach(&dev->ts1.analog_fe,
|
||||
0x60, &dev->i2c_bus[1].i2c_adap,
|
||||
&hauppauge_tda18271_config);
|
||||
|
||||
break;
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1800:
|
||||
i2c_bus = &dev->i2c_bus[0];
|
||||
|
@ -505,6 +505,9 @@ static int cx23885_video_mux(struct cx23885_dev *dev, unsigned int input)
|
||||
|
||||
if ((dev->board == CX23885_BOARD_HAUPPAUGE_HVR1800) ||
|
||||
(dev->board == CX23885_BOARD_MPX885) ||
|
||||
(dev->board == CX23885_BOARD_HAUPPAUGE_HVR1250) ||
|
||||
(dev->board == CX23885_BOARD_HAUPPAUGE_HVR1255) ||
|
||||
(dev->board == CX23885_BOARD_HAUPPAUGE_HVR1255_22111) ||
|
||||
(dev->board == CX23885_BOARD_HAUPPAUGE_HVR1850)) {
|
||||
/* Configure audio routing */
|
||||
v4l2_subdev_call(dev->sd_cx25840, audio, s_routing,
|
||||
@ -1578,7 +1581,9 @@ static int cx23885_set_freq_via_ops(struct cx23885_dev *dev,
|
||||
|
||||
fe = vfe->dvb.frontend;
|
||||
|
||||
if (dev->board == CX23885_BOARD_HAUPPAUGE_HVR1850)
|
||||
if ((dev->board == CX23885_BOARD_HAUPPAUGE_HVR1850) ||
|
||||
(dev->board == CX23885_BOARD_HAUPPAUGE_HVR1255) ||
|
||||
(dev->board == CX23885_BOARD_HAUPPAUGE_HVR1255_22111))
|
||||
fe = &dev->ts1.analog_fe;
|
||||
|
||||
if (fe && fe->ops.tuner_ops.set_analog_params) {
|
||||
@ -1608,6 +1613,8 @@ int cx23885_set_frequency(struct file *file, void *priv,
|
||||
int ret;
|
||||
|
||||
switch (dev->board) {
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
|
||||
case CX23885_BOARD_HAUPPAUGE_HVR1850:
|
||||
ret = cx23885_set_freq_via_ops(dev, f);
|
||||
break;
|
||||
|
@ -90,6 +90,7 @@
|
||||
#define CX23885_BOARD_MYGICA_X8507 33
|
||||
#define CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL 34
|
||||
#define CX23885_BOARD_TEVII_S471 35
|
||||
#define CX23885_BOARD_HAUPPAUGE_HVR1255_22111 36
|
||||
|
||||
#define GPIO_0 0x00000001
|
||||
#define GPIO_1 0x00000002
|
||||
|
@ -84,7 +84,7 @@ MODULE_PARM_DESC(debug, "Debugging messages [0=Off (default) 1=On]");
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
static void cx23885_std_setup(struct i2c_client *client);
|
||||
static void cx23888_std_setup(struct i2c_client *client);
|
||||
|
||||
int cx25840_write(struct i2c_client *client, u16 addr, u8 value)
|
||||
{
|
||||
@ -638,10 +638,13 @@ static void cx23885_initialize(struct i2c_client *client)
|
||||
finish_wait(&state->fw_wait, &wait);
|
||||
destroy_workqueue(q);
|
||||
|
||||
/* Call the cx23885 specific std setup func, we no longer rely on
|
||||
/* Call the cx23888 specific std setup func, we no longer rely on
|
||||
* the generic cx24840 func.
|
||||
*/
|
||||
cx23885_std_setup(client);
|
||||
if (is_cx23888(state))
|
||||
cx23888_std_setup(client);
|
||||
else
|
||||
cx25840_std_setup(client);
|
||||
|
||||
/* (re)set input */
|
||||
set_input(client, state->vid_input, state->aud_input);
|
||||
@ -1103,9 +1106,23 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
|
||||
|
||||
cx25840_write4(client, 0x410, 0xffff0dbf);
|
||||
cx25840_write4(client, 0x414, 0x00137d03);
|
||||
cx25840_write4(client, 0x418, 0x01008080);
|
||||
|
||||
/* on the 887, 0x418 is HSCALE_CTRL, on the 888 it is
|
||||
CHROMA_CTRL */
|
||||
if (is_cx23888(state))
|
||||
cx25840_write4(client, 0x418, 0x01008080);
|
||||
else
|
||||
cx25840_write4(client, 0x418, 0x01000000);
|
||||
|
||||
cx25840_write4(client, 0x41c, 0x00000000);
|
||||
cx25840_write4(client, 0x420, 0x001c3e0f);
|
||||
|
||||
/* on the 887, 0x420 is CHROMA_CTRL, on the 888 it is
|
||||
CRUSH_CTRL */
|
||||
if (is_cx23888(state))
|
||||
cx25840_write4(client, 0x420, 0x001c3e0f);
|
||||
else
|
||||
cx25840_write4(client, 0x420, 0x001c8282);
|
||||
|
||||
cx25840_write4(client, 0x42c, 0x42600000);
|
||||
cx25840_write4(client, 0x430, 0x0000039b);
|
||||
cx25840_write4(client, 0x438, 0x00000000);
|
||||
@ -1233,7 +1250,7 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp
|
||||
cx25840_write4(client, 0x8d0, 0x1f063870);
|
||||
}
|
||||
|
||||
if (is_cx2388x(state)) {
|
||||
if (is_cx23888(state)) {
|
||||
/* HVR1850 */
|
||||
/* AUD_IO_CTRL - I2S Input, Parallel1*/
|
||||
/* - Channel 1 src - Parallel1 (Merlin out) */
|
||||
@ -1298,8 +1315,8 @@ static int set_v4lstd(struct i2c_client *client)
|
||||
}
|
||||
cx25840_and_or(client, 0x400, ~0xf, fmt);
|
||||
cx25840_and_or(client, 0x403, ~0x3, pal_m);
|
||||
if (is_cx2388x(state))
|
||||
cx23885_std_setup(client);
|
||||
if (is_cx23888(state))
|
||||
cx23888_std_setup(client);
|
||||
else
|
||||
cx25840_std_setup(client);
|
||||
if (!is_cx2583x(state))
|
||||
@ -1312,6 +1329,7 @@ static int set_v4lstd(struct i2c_client *client)
|
||||
static int cx25840_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
{
|
||||
struct v4l2_subdev *sd = to_sd(ctrl);
|
||||
struct cx25840_state *state = to_state(sd);
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
|
||||
switch (ctrl->id) {
|
||||
@ -1324,12 +1342,20 @@ static int cx25840_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||
break;
|
||||
|
||||
case V4L2_CID_SATURATION:
|
||||
cx25840_write(client, 0x420, ctrl->val << 1);
|
||||
cx25840_write(client, 0x421, ctrl->val << 1);
|
||||
if (is_cx23888(state)) {
|
||||
cx25840_write(client, 0x418, ctrl->val << 1);
|
||||
cx25840_write(client, 0x419, ctrl->val << 1);
|
||||
} else {
|
||||
cx25840_write(client, 0x420, ctrl->val << 1);
|
||||
cx25840_write(client, 0x421, ctrl->val << 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case V4L2_CID_HUE:
|
||||
cx25840_write(client, 0x422, ctrl->val);
|
||||
if (is_cx23888(state))
|
||||
cx25840_write(client, 0x41a, ctrl->val);
|
||||
else
|
||||
cx25840_write(client, 0x422, ctrl->val);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1354,11 +1380,21 @@ static int cx25840_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt
|
||||
fmt->field = V4L2_FIELD_INTERLACED;
|
||||
fmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
|
||||
|
||||
Vsrc = (cx25840_read(client, 0x476) & 0x3f) << 4;
|
||||
Vsrc |= (cx25840_read(client, 0x475) & 0xf0) >> 4;
|
||||
if (is_cx23888(state)) {
|
||||
Vsrc = (cx25840_read(client, 0x42a) & 0x3f) << 4;
|
||||
Vsrc |= (cx25840_read(client, 0x429) & 0xf0) >> 4;
|
||||
} else {
|
||||
Vsrc = (cx25840_read(client, 0x476) & 0x3f) << 4;
|
||||
Vsrc |= (cx25840_read(client, 0x475) & 0xf0) >> 4;
|
||||
}
|
||||
|
||||
Hsrc = (cx25840_read(client, 0x472) & 0x3f) << 4;
|
||||
Hsrc |= (cx25840_read(client, 0x471) & 0xf0) >> 4;
|
||||
if (is_cx23888(state)) {
|
||||
Hsrc = (cx25840_read(client, 0x426) & 0x3f) << 4;
|
||||
Hsrc |= (cx25840_read(client, 0x425) & 0xf0) >> 4;
|
||||
} else {
|
||||
Hsrc = (cx25840_read(client, 0x472) & 0x3f) << 4;
|
||||
Hsrc |= (cx25840_read(client, 0x471) & 0xf0) >> 4;
|
||||
}
|
||||
|
||||
Vlines = fmt->height + (is_50Hz ? 4 : 7);
|
||||
|
||||
@ -1782,8 +1818,8 @@ static int cx25840_s_video_routing(struct v4l2_subdev *sd,
|
||||
struct cx25840_state *state = to_state(sd);
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
|
||||
if (is_cx2388x(state))
|
||||
cx23885_std_setup(client);
|
||||
if (is_cx23888(state))
|
||||
cx23888_std_setup(client);
|
||||
|
||||
return set_input(client, input, state->aud_input);
|
||||
}
|
||||
@ -1794,8 +1830,8 @@ static int cx25840_s_audio_routing(struct v4l2_subdev *sd,
|
||||
struct cx25840_state *state = to_state(sd);
|
||||
struct i2c_client *client = v4l2_get_subdevdata(sd);
|
||||
|
||||
if (is_cx2388x(state))
|
||||
cx23885_std_setup(client);
|
||||
if (is_cx23888(state))
|
||||
cx23888_std_setup(client);
|
||||
return set_input(client, state->vid_input, input);
|
||||
}
|
||||
|
||||
@ -4939,7 +4975,7 @@ void cx23885_dif_setup(struct i2c_client *client, u32 ifHz)
|
||||
}
|
||||
}
|
||||
|
||||
static void cx23885_std_setup(struct i2c_client *client)
|
||||
static void cx23888_std_setup(struct i2c_client *client)
|
||||
{
|
||||
struct cx25840_state *state = to_state(i2c_get_clientdata(client));
|
||||
v4l2_std_id std = state->std;
|
||||
|
@ -2893,7 +2893,7 @@ static void request_module_async(struct work_struct *work)
|
||||
|
||||
if (dev->board.has_dvb)
|
||||
request_module("em28xx-dvb");
|
||||
if (dev->board.has_ir_i2c && !disable_ir)
|
||||
if (dev->board.ir_codes && !disable_ir)
|
||||
request_module("em28xx-rc");
|
||||
}
|
||||
|
||||
|
@ -2070,10 +2070,13 @@ static int sd_start(struct gspca_dev *gspca_dev)
|
||||
set_gamma(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma));
|
||||
set_redblue(gspca_dev, v4l2_ctrl_g_ctrl(sd->blue),
|
||||
v4l2_ctrl_g_ctrl(sd->red));
|
||||
set_gain(gspca_dev, v4l2_ctrl_g_ctrl(sd->gain));
|
||||
set_exposure(gspca_dev, v4l2_ctrl_g_ctrl(sd->exposure));
|
||||
set_hvflip(gspca_dev, v4l2_ctrl_g_ctrl(sd->hflip),
|
||||
v4l2_ctrl_g_ctrl(sd->vflip));
|
||||
if (sd->gain)
|
||||
set_gain(gspca_dev, v4l2_ctrl_g_ctrl(sd->gain));
|
||||
if (sd->exposure)
|
||||
set_exposure(gspca_dev, v4l2_ctrl_g_ctrl(sd->exposure));
|
||||
if (sd->hflip)
|
||||
set_hvflip(gspca_dev, v4l2_ctrl_g_ctrl(sd->hflip),
|
||||
v4l2_ctrl_g_ctrl(sd->vflip));
|
||||
|
||||
reg_w1(gspca_dev, 0x1007, 0x20);
|
||||
reg_w1(gspca_dev, 0x1061, 0x03);
|
||||
@ -2176,7 +2179,7 @@ static void sd_dqcallback(struct gspca_dev *gspca_dev)
|
||||
struct sd *sd = (struct sd *) gspca_dev;
|
||||
int avg_lum;
|
||||
|
||||
if (!v4l2_ctrl_g_ctrl(sd->autogain))
|
||||
if (sd->autogain == NULL || !v4l2_ctrl_g_ctrl(sd->autogain))
|
||||
return;
|
||||
|
||||
avg_lum = atomic_read(&sd->avg_lum);
|
||||
|
@ -83,6 +83,7 @@
|
||||
#define CSICR1_INV_DATA (1 << 3)
|
||||
#define CSICR1_INV_PCLK (1 << 2)
|
||||
#define CSICR1_REDGE (1 << 1)
|
||||
#define CSICR1_FMT_MASK (CSICR1_PACK_DIR | CSICR1_SWAP16_EN)
|
||||
|
||||
#define SHIFT_STATFF_LEVEL 22
|
||||
#define SHIFT_RXFF_LEVEL 19
|
||||
@ -230,6 +231,7 @@ struct mx2_prp_cfg {
|
||||
u32 src_pixel;
|
||||
u32 ch1_pixel;
|
||||
u32 irq_flags;
|
||||
u32 csicr1;
|
||||
};
|
||||
|
||||
/* prp resizing parameters */
|
||||
@ -330,6 +332,7 @@ static struct mx2_fmt_cfg mx27_emma_prp_table[] = {
|
||||
.ch1_pixel = 0x2ca00565, /* RGB565 */
|
||||
.irq_flags = PRP_INTR_RDERR | PRP_INTR_CH1WERR |
|
||||
PRP_INTR_CH1FC | PRP_INTR_LBOVF,
|
||||
.csicr1 = 0,
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -343,6 +346,21 @@ static struct mx2_fmt_cfg mx27_emma_prp_table[] = {
|
||||
.irq_flags = PRP_INTR_RDERR | PRP_INTR_CH2WERR |
|
||||
PRP_INTR_CH2FC | PRP_INTR_LBOVF |
|
||||
PRP_INTR_CH2OVF,
|
||||
.csicr1 = CSICR1_PACK_DIR,
|
||||
}
|
||||
},
|
||||
{
|
||||
.in_fmt = V4L2_MBUS_FMT_UYVY8_2X8,
|
||||
.out_fmt = V4L2_PIX_FMT_YUV420,
|
||||
.cfg = {
|
||||
.channel = 2,
|
||||
.in_fmt = PRP_CNTL_DATA_IN_YUV422,
|
||||
.out_fmt = PRP_CNTL_CH2_OUT_YUV420,
|
||||
.src_pixel = 0x22000888, /* YUV422 (YUYV) */
|
||||
.irq_flags = PRP_INTR_RDERR | PRP_INTR_CH2WERR |
|
||||
PRP_INTR_CH2FC | PRP_INTR_LBOVF |
|
||||
PRP_INTR_CH2OVF,
|
||||
.csicr1 = CSICR1_SWAP16_EN,
|
||||
}
|
||||
},
|
||||
};
|
||||
@ -1015,14 +1033,14 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
csicr1 = (csicr1 & ~CSICR1_FMT_MASK) | pcdev->emma_prp->cfg.csicr1;
|
||||
|
||||
if (common_flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
|
||||
csicr1 |= CSICR1_REDGE;
|
||||
if (common_flags & V4L2_MBUS_VSYNC_ACTIVE_HIGH)
|
||||
csicr1 |= CSICR1_SOF_POL;
|
||||
if (common_flags & V4L2_MBUS_HSYNC_ACTIVE_HIGH)
|
||||
csicr1 |= CSICR1_HSYNC_POL;
|
||||
if (pcdev->platform_flags & MX2_CAMERA_SWAP16)
|
||||
csicr1 |= CSICR1_SWAP16_EN;
|
||||
if (pcdev->platform_flags & MX2_CAMERA_EXT_VSYNC)
|
||||
csicr1 |= CSICR1_EXT_VSYNC;
|
||||
if (pcdev->platform_flags & MX2_CAMERA_CCIR)
|
||||
@ -1033,8 +1051,6 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd)
|
||||
csicr1 |= CSICR1_GCLK_MODE;
|
||||
if (pcdev->platform_flags & MX2_CAMERA_INV_DATA)
|
||||
csicr1 |= CSICR1_INV_DATA;
|
||||
if (pcdev->platform_flags & MX2_CAMERA_PACK_DIR_MSB)
|
||||
csicr1 |= CSICR1_PACK_DIR;
|
||||
|
||||
pcdev->csicr1 = csicr1;
|
||||
|
||||
@ -1109,7 +1125,8 @@ static int mx2_camera_get_formats(struct soc_camera_device *icd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (code == V4L2_MBUS_FMT_YUYV8_2X8) {
|
||||
if (code == V4L2_MBUS_FMT_YUYV8_2X8 ||
|
||||
code == V4L2_MBUS_FMT_UYVY8_2X8) {
|
||||
formats++;
|
||||
if (xlate) {
|
||||
/*
|
||||
|
@ -888,12 +888,12 @@ static const struct preview_update update_attrs[] = {
|
||||
preview_config_contrast,
|
||||
NULL,
|
||||
offsetof(struct prev_params, contrast),
|
||||
0, true,
|
||||
0, 0, true,
|
||||
}, /* OMAP3ISP_PREV_BRIGHTNESS */ {
|
||||
preview_config_brightness,
|
||||
NULL,
|
||||
offsetof(struct prev_params, brightness),
|
||||
0, true,
|
||||
0, 0, true,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1102,7 +1102,7 @@ static void preview_config_input_size(struct isp_prev_device *prev, u32 active)
|
||||
unsigned int elv = prev->crop.top + prev->crop.height - 1;
|
||||
u32 features;
|
||||
|
||||
if (format->code == V4L2_MBUS_FMT_Y10_1X10) {
|
||||
if (format->code != V4L2_MBUS_FMT_Y10_1X10) {
|
||||
sph -= 2;
|
||||
eph += 2;
|
||||
slv -= 2;
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mutex.h>
|
||||
|
@ -350,7 +350,8 @@ static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *pfmt,
|
||||
if (pixm)
|
||||
sizes[i] = max(size, pixm->plane_fmt[i].sizeimage);
|
||||
else
|
||||
sizes[i] = size;
|
||||
sizes[i] = max_t(u32, size, frame->payload[i]);
|
||||
|
||||
allocators[i] = ctx->fimc_dev->alloc_ctx;
|
||||
}
|
||||
|
||||
@ -479,37 +480,39 @@ static int fimc_capture_set_default_format(struct fimc_dev *fimc);
|
||||
static int fimc_capture_open(struct file *file)
|
||||
{
|
||||
struct fimc_dev *fimc = video_drvdata(file);
|
||||
int ret = v4l2_fh_open(file);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
int ret;
|
||||
|
||||
dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state);
|
||||
|
||||
/* Return if the corresponding video mem2mem node is already opened. */
|
||||
if (fimc_m2m_active(fimc))
|
||||
return -EBUSY;
|
||||
|
||||
set_bit(ST_CAPT_BUSY, &fimc->state);
|
||||
pm_runtime_get_sync(&fimc->pdev->dev);
|
||||
ret = pm_runtime_get_sync(&fimc->pdev->dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (++fimc->vid_cap.refcnt == 1) {
|
||||
ret = fimc_pipeline_initialize(&fimc->pipeline,
|
||||
&fimc->vid_cap.vfd->entity, true);
|
||||
if (ret < 0) {
|
||||
dev_err(&fimc->pdev->dev,
|
||||
"Video pipeline initialization failed\n");
|
||||
pm_runtime_put_sync(&fimc->pdev->dev);
|
||||
fimc->vid_cap.refcnt--;
|
||||
v4l2_fh_release(file);
|
||||
clear_bit(ST_CAPT_BUSY, &fimc->state);
|
||||
return ret;
|
||||
}
|
||||
ret = fimc_capture_ctrls_create(fimc);
|
||||
ret = v4l2_fh_open(file);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!ret && !fimc->vid_cap.user_subdev_api)
|
||||
ret = fimc_capture_set_default_format(fimc);
|
||||
if (++fimc->vid_cap.refcnt != 1)
|
||||
return 0;
|
||||
|
||||
ret = fimc_pipeline_initialize(&fimc->pipeline,
|
||||
&fimc->vid_cap.vfd->entity, true);
|
||||
if (ret < 0) {
|
||||
clear_bit(ST_CAPT_BUSY, &fimc->state);
|
||||
pm_runtime_put_sync(&fimc->pdev->dev);
|
||||
fimc->vid_cap.refcnt--;
|
||||
v4l2_fh_release(file);
|
||||
return ret;
|
||||
}
|
||||
ret = fimc_capture_ctrls_create(fimc);
|
||||
|
||||
if (!ret && !fimc->vid_cap.user_subdev_api)
|
||||
ret = fimc_capture_set_default_format(fimc);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -818,9 +821,6 @@ static int fimc_cap_g_fmt_mplane(struct file *file, void *fh,
|
||||
struct fimc_dev *fimc = video_drvdata(file);
|
||||
struct fimc_ctx *ctx = fimc->vid_cap.ctx;
|
||||
|
||||
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
|
||||
return -EINVAL;
|
||||
|
||||
return fimc_fill_format(&ctx->d_frame, f);
|
||||
}
|
||||
|
||||
@ -833,9 +833,6 @@ static int fimc_cap_try_fmt_mplane(struct file *file, void *fh,
|
||||
struct v4l2_mbus_framefmt mf;
|
||||
struct fimc_fmt *ffmt = NULL;
|
||||
|
||||
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
|
||||
return -EINVAL;
|
||||
|
||||
if (pix->pixelformat == V4L2_PIX_FMT_JPEG) {
|
||||
fimc_capture_try_format(ctx, &pix->width, &pix->height,
|
||||
NULL, &pix->pixelformat,
|
||||
@ -887,8 +884,6 @@ static int fimc_capture_set_format(struct fimc_dev *fimc, struct v4l2_format *f)
|
||||
struct fimc_fmt *s_fmt = NULL;
|
||||
int ret, i;
|
||||
|
||||
if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
|
||||
return -EINVAL;
|
||||
if (vb2_is_busy(&fimc->vid_cap.vbq))
|
||||
return -EBUSY;
|
||||
|
||||
@ -924,10 +919,10 @@ static int fimc_capture_set_format(struct fimc_dev *fimc, struct v4l2_format *f)
|
||||
pix->width = mf->width;
|
||||
pix->height = mf->height;
|
||||
}
|
||||
|
||||
fimc_adjust_mplane_format(ff->fmt, pix->width, pix->height, pix);
|
||||
for (i = 0; i < ff->fmt->colplanes; i++)
|
||||
ff->payload[i] =
|
||||
(pix->width * pix->height * ff->fmt->depth[i]) / 8;
|
||||
ff->payload[i] = pix->plane_fmt[i].sizeimage;
|
||||
|
||||
set_frame_bounds(ff, pix->width, pix->height);
|
||||
/* Reset the composition rectangle if not yet configured */
|
||||
@ -1045,18 +1040,22 @@ static int fimc_cap_streamon(struct file *file, void *priv,
|
||||
{
|
||||
struct fimc_dev *fimc = video_drvdata(file);
|
||||
struct fimc_pipeline *p = &fimc->pipeline;
|
||||
struct v4l2_subdev *sd = p->subdevs[IDX_SENSOR];
|
||||
int ret;
|
||||
|
||||
if (fimc_capture_active(fimc))
|
||||
return -EBUSY;
|
||||
|
||||
media_entity_pipeline_start(&p->subdevs[IDX_SENSOR]->entity,
|
||||
p->m_pipeline);
|
||||
ret = media_entity_pipeline_start(&sd->entity, p->m_pipeline);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (fimc->vid_cap.user_subdev_api) {
|
||||
ret = fimc_pipeline_validate(fimc);
|
||||
if (ret)
|
||||
if (ret < 0) {
|
||||
media_entity_pipeline_stop(&sd->entity);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return vb2_streamon(&fimc->vid_cap.vbq, type);
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ static struct fimc_fmt fimc_formats[] = {
|
||||
.colplanes = 2,
|
||||
.flags = FMT_FLAGS_M2M,
|
||||
}, {
|
||||
.name = "YUV 4:2:0 non-contiguous 2-planar, Y/CbCr",
|
||||
.name = "YUV 4:2:0 non-contig. 2p, Y/CbCr",
|
||||
.fourcc = V4L2_PIX_FMT_NV12M,
|
||||
.color = FIMC_FMT_YCBCR420,
|
||||
.depth = { 8, 4 },
|
||||
@ -161,7 +161,7 @@ static struct fimc_fmt fimc_formats[] = {
|
||||
.colplanes = 2,
|
||||
.flags = FMT_FLAGS_M2M,
|
||||
}, {
|
||||
.name = "YUV 4:2:0 non-contiguous 3-planar, Y/Cb/Cr",
|
||||
.name = "YUV 4:2:0 non-contig. 3p, Y/Cb/Cr",
|
||||
.fourcc = V4L2_PIX_FMT_YUV420M,
|
||||
.color = FIMC_FMT_YCBCR420,
|
||||
.depth = { 8, 2, 2 },
|
||||
@ -169,7 +169,7 @@ static struct fimc_fmt fimc_formats[] = {
|
||||
.colplanes = 3,
|
||||
.flags = FMT_FLAGS_M2M,
|
||||
}, {
|
||||
.name = "YUV 4:2:0 non-contiguous 2-planar, Y/CbCr, tiled",
|
||||
.name = "YUV 4:2:0 non-contig. 2p, tiled",
|
||||
.fourcc = V4L2_PIX_FMT_NV12MT,
|
||||
.color = FIMC_FMT_YCBCR420,
|
||||
.depth = { 8, 4 },
|
||||
@ -641,7 +641,7 @@ void fimc_ctrls_activate(struct fimc_ctx *ctx, bool active)
|
||||
if (!ctrls->ready)
|
||||
return;
|
||||
|
||||
mutex_lock(&ctrls->handler.lock);
|
||||
mutex_lock(ctrls->handler.lock);
|
||||
v4l2_ctrl_activate(ctrls->rotate, active);
|
||||
v4l2_ctrl_activate(ctrls->hflip, active);
|
||||
v4l2_ctrl_activate(ctrls->vflip, active);
|
||||
@ -660,7 +660,7 @@ void fimc_ctrls_activate(struct fimc_ctx *ctx, bool active)
|
||||
ctx->hflip = 0;
|
||||
ctx->vflip = 0;
|
||||
}
|
||||
mutex_unlock(&ctrls->handler.lock);
|
||||
mutex_unlock(ctrls->handler.lock);
|
||||
}
|
||||
|
||||
/* Update maximum value of the alpha color control */
|
||||
@ -741,8 +741,8 @@ void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height,
|
||||
pix->width = width;
|
||||
|
||||
for (i = 0; i < pix->num_planes; ++i) {
|
||||
u32 bpl = pix->plane_fmt[i].bytesperline;
|
||||
u32 *sizeimage = &pix->plane_fmt[i].sizeimage;
|
||||
struct v4l2_plane_pix_format *plane_fmt = &pix->plane_fmt[i];
|
||||
u32 bpl = plane_fmt->bytesperline;
|
||||
|
||||
if (fmt->colplanes > 1 && (bpl == 0 || bpl < pix->width))
|
||||
bpl = pix->width; /* Planar */
|
||||
@ -754,8 +754,9 @@ void fimc_adjust_mplane_format(struct fimc_fmt *fmt, u32 width, u32 height,
|
||||
if (i == 0) /* Same bytesperline for each plane. */
|
||||
bytesperline = bpl;
|
||||
|
||||
pix->plane_fmt[i].bytesperline = bytesperline;
|
||||
*sizeimage = (pix->width * pix->height * fmt->depth[i]) / 8;
|
||||
plane_fmt->bytesperline = bytesperline;
|
||||
plane_fmt->sizeimage = max((pix->width * pix->height *
|
||||
fmt->depth[i]) / 8, plane_fmt->sizeimage);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -451,34 +451,44 @@ static void fimc_lite_clear_event_counters(struct fimc_lite *fimc)
|
||||
static int fimc_lite_open(struct file *file)
|
||||
{
|
||||
struct fimc_lite *fimc = video_drvdata(file);
|
||||
int ret = v4l2_fh_open(file);
|
||||
int ret;
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
if (mutex_lock_interruptible(&fimc->lock))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
set_bit(ST_FLITE_IN_USE, &fimc->state);
|
||||
pm_runtime_get_sync(&fimc->pdev->dev);
|
||||
ret = pm_runtime_get_sync(&fimc->pdev->dev);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
|
||||
if (++fimc->ref_count != 1 || fimc->out_path != FIMC_IO_DMA)
|
||||
return ret;
|
||||
ret = v4l2_fh_open(file);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
|
||||
ret = fimc_pipeline_initialize(&fimc->pipeline, &fimc->vfd->entity,
|
||||
true);
|
||||
if (ret < 0) {
|
||||
v4l2_err(fimc->vfd, "Video pipeline initialization failed\n");
|
||||
pm_runtime_put_sync(&fimc->pdev->dev);
|
||||
fimc->ref_count--;
|
||||
v4l2_fh_release(file);
|
||||
clear_bit(ST_FLITE_IN_USE, &fimc->state);
|
||||
if (++fimc->ref_count == 1 && fimc->out_path == FIMC_IO_DMA) {
|
||||
ret = fimc_pipeline_initialize(&fimc->pipeline,
|
||||
&fimc->vfd->entity, true);
|
||||
if (ret < 0) {
|
||||
pm_runtime_put_sync(&fimc->pdev->dev);
|
||||
fimc->ref_count--;
|
||||
v4l2_fh_release(file);
|
||||
clear_bit(ST_FLITE_IN_USE, &fimc->state);
|
||||
}
|
||||
|
||||
fimc_lite_clear_event_counters(fimc);
|
||||
}
|
||||
|
||||
fimc_lite_clear_event_counters(fimc);
|
||||
done:
|
||||
mutex_unlock(&fimc->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int fimc_lite_close(struct file *file)
|
||||
{
|
||||
struct fimc_lite *fimc = video_drvdata(file);
|
||||
int ret;
|
||||
|
||||
if (mutex_lock_interruptible(&fimc->lock))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (--fimc->ref_count == 0 && fimc->out_path == FIMC_IO_DMA) {
|
||||
clear_bit(ST_FLITE_IN_USE, &fimc->state);
|
||||
@ -492,20 +502,39 @@ static int fimc_lite_close(struct file *file)
|
||||
if (fimc->ref_count == 0)
|
||||
vb2_queue_release(&fimc->vb_queue);
|
||||
|
||||
return v4l2_fh_release(file);
|
||||
ret = v4l2_fh_release(file);
|
||||
|
||||
mutex_unlock(&fimc->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int fimc_lite_poll(struct file *file,
|
||||
struct poll_table_struct *wait)
|
||||
{
|
||||
struct fimc_lite *fimc = video_drvdata(file);
|
||||
return vb2_poll(&fimc->vb_queue, file, wait);
|
||||
int ret;
|
||||
|
||||
if (mutex_lock_interruptible(&fimc->lock))
|
||||
return POLL_ERR;
|
||||
|
||||
ret = vb2_poll(&fimc->vb_queue, file, wait);
|
||||
mutex_unlock(&fimc->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int fimc_lite_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
struct fimc_lite *fimc = video_drvdata(file);
|
||||
return vb2_mmap(&fimc->vb_queue, vma);
|
||||
int ret;
|
||||
|
||||
if (mutex_lock_interruptible(&fimc->lock))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
ret = vb2_mmap(&fimc->vb_queue, vma);
|
||||
mutex_unlock(&fimc->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct v4l2_file_operations fimc_lite_fops = {
|
||||
@ -762,7 +791,9 @@ static int fimc_lite_streamon(struct file *file, void *priv,
|
||||
if (fimc_lite_active(fimc))
|
||||
return -EBUSY;
|
||||
|
||||
media_entity_pipeline_start(&sensor->entity, p->m_pipeline);
|
||||
ret = media_entity_pipeline_start(&sensor->entity, p->m_pipeline);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = fimc_pipeline_validate(fimc);
|
||||
if (ret) {
|
||||
@ -1508,7 +1539,7 @@ static int fimc_lite_suspend(struct device *dev)
|
||||
return 0;
|
||||
|
||||
ret = fimc_lite_stop_capture(fimc, suspend);
|
||||
if (ret)
|
||||
if (ret < 0 || !fimc_lite_active(fimc))
|
||||
return ret;
|
||||
|
||||
return fimc_pipeline_shutdown(&fimc->pipeline);
|
||||
|
@ -193,9 +193,13 @@ int __fimc_pipeline_shutdown(struct fimc_pipeline *p)
|
||||
|
||||
int fimc_pipeline_shutdown(struct fimc_pipeline *p)
|
||||
{
|
||||
struct media_entity *me = &p->subdevs[IDX_SENSOR]->entity;
|
||||
struct media_entity *me;
|
||||
int ret;
|
||||
|
||||
if (!p || !p->subdevs[IDX_SENSOR])
|
||||
return -EINVAL;
|
||||
|
||||
me = &p->subdevs[IDX_SENSOR]->entity;
|
||||
mutex_lock(&me->parent->graph_mutex);
|
||||
ret = __fimc_pipeline_shutdown(p);
|
||||
mutex_unlock(&me->parent->graph_mutex);
|
||||
@ -498,12 +502,12 @@ static void fimc_md_unregister_entities(struct fimc_md *fmd)
|
||||
* @source: the source entity to create links to all fimc entities from
|
||||
* @sensor: sensor subdev linked to FIMC[fimc_id] entity, may be null
|
||||
* @pad: the source entity pad index
|
||||
* @fimc_id: index of the fimc device for which link should be enabled
|
||||
* @link_mask: bitmask of the fimc devices for which link should be enabled
|
||||
*/
|
||||
static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
|
||||
struct media_entity *source,
|
||||
struct v4l2_subdev *sensor,
|
||||
int pad, int fimc_id)
|
||||
int pad, int link_mask)
|
||||
{
|
||||
struct fimc_sensor_info *s_info;
|
||||
struct media_entity *sink;
|
||||
@ -520,7 +524,7 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
|
||||
if (!fmd->fimc[i]->variant->has_cam_if)
|
||||
continue;
|
||||
|
||||
flags = (i == fimc_id) ? MEDIA_LNK_FL_ENABLED : 0;
|
||||
flags = ((1 << i) & link_mask) ? MEDIA_LNK_FL_ENABLED : 0;
|
||||
|
||||
sink = &fmd->fimc[i]->vid_cap.subdev.entity;
|
||||
ret = media_entity_create_link(source, pad, sink,
|
||||
@ -552,7 +556,10 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd,
|
||||
if (!fmd->fimc_lite[i])
|
||||
continue;
|
||||
|
||||
flags = (i == fimc_id) ? MEDIA_LNK_FL_ENABLED : 0;
|
||||
if (link_mask & (1 << (i + FIMC_MAX_DEVS)))
|
||||
flags = MEDIA_LNK_FL_ENABLED;
|
||||
else
|
||||
flags = 0;
|
||||
|
||||
sink = &fmd->fimc_lite[i]->subdev.entity;
|
||||
ret = media_entity_create_link(source, pad, sink,
|
||||
@ -614,9 +621,8 @@ static int fimc_md_create_links(struct fimc_md *fmd)
|
||||
struct s5p_fimc_isp_info *pdata;
|
||||
struct fimc_sensor_info *s_info;
|
||||
struct media_entity *source, *sink;
|
||||
int i, pad, fimc_id = 0;
|
||||
int ret = 0;
|
||||
u32 flags;
|
||||
int i, pad, fimc_id = 0, ret = 0;
|
||||
u32 flags, link_mask = 0;
|
||||
|
||||
for (i = 0; i < fmd->num_sensors; i++) {
|
||||
if (fmd->sensor[i].subdev == NULL)
|
||||
@ -668,19 +674,20 @@ static int fimc_md_create_links(struct fimc_md *fmd)
|
||||
if (source == NULL)
|
||||
continue;
|
||||
|
||||
link_mask = 1 << fimc_id++;
|
||||
ret = __fimc_md_create_fimc_sink_links(fmd, source, sensor,
|
||||
pad, fimc_id++);
|
||||
pad, link_mask);
|
||||
}
|
||||
|
||||
fimc_id = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(fmd->csis); i++) {
|
||||
if (fmd->csis[i].sd == NULL)
|
||||
continue;
|
||||
source = &fmd->csis[i].sd->entity;
|
||||
pad = CSIS_PAD_SOURCE;
|
||||
|
||||
link_mask = 1 << fimc_id++;
|
||||
ret = __fimc_md_create_fimc_sink_links(fmd, source, NULL,
|
||||
pad, fimc_id++);
|
||||
pad, link_mask);
|
||||
}
|
||||
|
||||
/* Create immutable links between each FIMC's subdev and video node */
|
||||
@ -734,8 +741,8 @@ static void fimc_md_put_clocks(struct fimc_md *fmd)
|
||||
}
|
||||
|
||||
static int __fimc_md_set_camclk(struct fimc_md *fmd,
|
||||
struct fimc_sensor_info *s_info,
|
||||
bool on)
|
||||
struct fimc_sensor_info *s_info,
|
||||
bool on)
|
||||
{
|
||||
struct s5p_fimc_isp_info *pdata = s_info->pdata;
|
||||
struct fimc_camclk_info *camclk;
|
||||
@ -744,12 +751,10 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd,
|
||||
if (WARN_ON(pdata->clk_id >= FIMC_MAX_CAMCLKS) || fmd == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
if (s_info->clk_on == on)
|
||||
return 0;
|
||||
camclk = &fmd->camclk[pdata->clk_id];
|
||||
|
||||
dbg("camclk %d, f: %lu, clk: %p, on: %d",
|
||||
pdata->clk_id, pdata->clk_frequency, camclk, on);
|
||||
dbg("camclk %d, f: %lu, use_count: %d, on: %d",
|
||||
pdata->clk_id, pdata->clk_frequency, camclk->use_count, on);
|
||||
|
||||
if (on) {
|
||||
if (camclk->use_count > 0 &&
|
||||
@ -760,11 +765,9 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd,
|
||||
clk_set_rate(camclk->clock, pdata->clk_frequency);
|
||||
camclk->frequency = pdata->clk_frequency;
|
||||
ret = clk_enable(camclk->clock);
|
||||
dbg("Enabled camclk %d: f: %lu", pdata->clk_id,
|
||||
clk_get_rate(camclk->clock));
|
||||
}
|
||||
s_info->clk_on = 1;
|
||||
dbg("Enabled camclk %d: f: %lu", pdata->clk_id,
|
||||
clk_get_rate(camclk->clock));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -773,7 +776,6 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd,
|
||||
|
||||
if (--camclk->use_count == 0) {
|
||||
clk_disable(camclk->clock);
|
||||
s_info->clk_on = 0;
|
||||
dbg("Disabled camclk %d", pdata->clk_id);
|
||||
}
|
||||
return ret;
|
||||
@ -789,8 +791,6 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd,
|
||||
* devices to which sensors can be attached, either directly or through
|
||||
* the MIPI CSI receiver. The clock is allowed here to be used by
|
||||
* multiple sensors concurrently if they use same frequency.
|
||||
* The per sensor subdev clk_on attribute helps to synchronize accesses
|
||||
* to the sclk_cam clocks from the video and media device nodes.
|
||||
* This function should only be called when the graph mutex is held.
|
||||
*/
|
||||
int fimc_md_set_camclk(struct v4l2_subdev *sd, bool on)
|
||||
|
@ -47,7 +47,6 @@ struct fimc_camclk_info {
|
||||
* @pdata: sensor's atrributes passed as media device's platform data
|
||||
* @subdev: image sensor v4l2 subdev
|
||||
* @host: fimc device the sensor is currently linked to
|
||||
* @clk_on: sclk_cam clock's state associated with this subdev
|
||||
*
|
||||
* This data structure applies to image sensor and the writeback subdevs.
|
||||
*/
|
||||
@ -55,7 +54,6 @@ struct fimc_sensor_info {
|
||||
struct s5p_fimc_isp_info *pdata;
|
||||
struct v4l2_subdev *subdev;
|
||||
struct fimc_dev *host;
|
||||
bool clk_on;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -996,6 +996,7 @@ int s5p_mfc_dec_ctrls_setup(struct s5p_mfc_ctx *ctx)
|
||||
|
||||
for (i = 0; i < NUM_CTRLS; i++) {
|
||||
if (IS_MFC51_PRIV(controls[i].id)) {
|
||||
memset(&cfg, 0, sizeof(struct v4l2_ctrl_config));
|
||||
cfg.ops = &s5p_mfc_dec_ctrl_ops;
|
||||
cfg.id = controls[i].id;
|
||||
cfg.min = controls[i].minimum;
|
||||
|
@ -1773,6 +1773,7 @@ int s5p_mfc_enc_ctrls_setup(struct s5p_mfc_ctx *ctx)
|
||||
}
|
||||
for (i = 0; i < NUM_CTRLS; i++) {
|
||||
if (IS_MFC51_PRIV(controls[i].id)) {
|
||||
memset(&cfg, 0, sizeof(struct v4l2_ctrl_config));
|
||||
cfg.ops = &s5p_mfc_enc_ctrl_ops;
|
||||
cfg.id = controls[i].id;
|
||||
cfg.min = controls[i].minimum;
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/v4l2-mediabus.h>
|
||||
|
@ -286,6 +286,7 @@ config TWL6040_CORE
|
||||
depends on I2C=y && GENERIC_HARDIRQS
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
select IRQ_DOMAIN
|
||||
default n
|
||||
help
|
||||
Say yes here if you want support for Texas Instruments TWL6040 audio
|
||||
|
@ -1,87 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 ST-Ericsson
|
||||
* License terms: GNU General Public License (GPL) version 2
|
||||
* Shared definitions and data structures for the AB5500 MFD driver
|
||||
*/
|
||||
|
||||
/* Read/write operation values. */
|
||||
#define AB5500_PERM_RD (0x01)
|
||||
#define AB5500_PERM_WR (0x02)
|
||||
|
||||
/* Read/write permissions. */
|
||||
#define AB5500_PERM_RO (AB5500_PERM_RD)
|
||||
#define AB5500_PERM_RW (AB5500_PERM_RD | AB5500_PERM_WR)
|
||||
|
||||
#define AB5500_MASK_BASE (0x60)
|
||||
#define AB5500_MASK_END (0x79)
|
||||
#define AB5500_CHIP_ID (0x20)
|
||||
|
||||
/**
|
||||
* struct ab5500_reg_range
|
||||
* @first: the first address of the range
|
||||
* @last: the last address of the range
|
||||
* @perm: access permissions for the range
|
||||
*/
|
||||
struct ab5500_reg_range {
|
||||
u8 first;
|
||||
u8 last;
|
||||
u8 perm;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ab5500_i2c_ranges
|
||||
* @count: the number of ranges in the list
|
||||
* @range: the list of register ranges
|
||||
*/
|
||||
struct ab5500_i2c_ranges {
|
||||
u8 nranges;
|
||||
u8 bankid;
|
||||
const struct ab5500_reg_range *range;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ab5500_i2c_banks
|
||||
* @count: the number of ranges in the list
|
||||
* @range: the list of register ranges
|
||||
*/
|
||||
struct ab5500_i2c_banks {
|
||||
u8 nbanks;
|
||||
const struct ab5500_i2c_ranges *bank;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ab5500_bank
|
||||
* @slave_addr: I2C slave_addr found in AB5500 specification
|
||||
* @name: Documentation name of the bank. For reference
|
||||
*/
|
||||
struct ab5500_bank {
|
||||
u8 slave_addr;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
static const struct ab5500_bank bankinfo[AB5500_NUM_BANKS] = {
|
||||
[AB5500_BANK_VIT_IO_I2C_CLK_TST_OTP] = {
|
||||
AB5500_ADDR_VIT_IO_I2C_CLK_TST_OTP, "VIT_IO_I2C_CLK_TST_OTP"},
|
||||
[AB5500_BANK_VDDDIG_IO_I2C_CLK_TST] = {
|
||||
AB5500_ADDR_VDDDIG_IO_I2C_CLK_TST, "VDDDIG_IO_I2C_CLK_TST"},
|
||||
[AB5500_BANK_VDENC] = {AB5500_ADDR_VDENC, "VDENC"},
|
||||
[AB5500_BANK_SIM_USBSIM] = {AB5500_ADDR_SIM_USBSIM, "SIM_USBSIM"},
|
||||
[AB5500_BANK_LED] = {AB5500_ADDR_LED, "LED"},
|
||||
[AB5500_BANK_ADC] = {AB5500_ADDR_ADC, "ADC"},
|
||||
[AB5500_BANK_RTC] = {AB5500_ADDR_RTC, "RTC"},
|
||||
[AB5500_BANK_STARTUP] = {AB5500_ADDR_STARTUP, "STARTUP"},
|
||||
[AB5500_BANK_DBI_ECI] = {AB5500_ADDR_DBI_ECI, "DBI-ECI"},
|
||||
[AB5500_BANK_CHG] = {AB5500_ADDR_CHG, "CHG"},
|
||||
[AB5500_BANK_FG_BATTCOM_ACC] = {
|
||||
AB5500_ADDR_FG_BATTCOM_ACC, "FG_BATCOM_ACC"},
|
||||
[AB5500_BANK_USB] = {AB5500_ADDR_USB, "USB"},
|
||||
[AB5500_BANK_IT] = {AB5500_ADDR_IT, "IT"},
|
||||
[AB5500_BANK_VIBRA] = {AB5500_ADDR_VIBRA, "VIBRA"},
|
||||
[AB5500_BANK_AUDIO_HEADSETUSB] = {
|
||||
AB5500_ADDR_AUDIO_HEADSETUSB, "AUDIO_HEADSETUSB"},
|
||||
};
|
||||
|
||||
int ab5500_get_register_interruptible_raw(struct ab5500 *ab, u8 bank, u8 reg,
|
||||
u8 *value);
|
||||
int ab5500_mask_and_set_register_interruptible_raw(struct ab5500 *ab, u8 bank,
|
||||
u8 reg, u8 bitmask, u8 bitvalues);
|
@ -49,10 +49,72 @@ static struct regmap_config mc13xxx_regmap_spi_config = {
|
||||
.reg_bits = 7,
|
||||
.pad_bits = 1,
|
||||
.val_bits = 24,
|
||||
.write_flag_mask = 0x80,
|
||||
|
||||
.max_register = MC13XXX_NUMREGS,
|
||||
|
||||
.cache_type = REGCACHE_NONE,
|
||||
.use_single_rw = 1,
|
||||
};
|
||||
|
||||
static int mc13xxx_spi_read(void *context, const void *reg, size_t reg_size,
|
||||
void *val, size_t val_size)
|
||||
{
|
||||
unsigned char w[4] = { *((unsigned char *) reg), 0, 0, 0};
|
||||
unsigned char r[4];
|
||||
unsigned char *p = val;
|
||||
struct device *dev = context;
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
struct spi_transfer t = {
|
||||
.tx_buf = w,
|
||||
.rx_buf = r,
|
||||
.len = 4,
|
||||
};
|
||||
|
||||
struct spi_message m;
|
||||
int ret;
|
||||
|
||||
if (val_size != 3 || reg_size != 1)
|
||||
return -ENOTSUPP;
|
||||
|
||||
spi_message_init(&m);
|
||||
spi_message_add_tail(&t, &m);
|
||||
ret = spi_sync(spi, &m);
|
||||
|
||||
memcpy(p, &r[1], 3);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mc13xxx_spi_write(void *context, const void *data, size_t count)
|
||||
{
|
||||
struct device *dev = context;
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
|
||||
if (count != 4)
|
||||
return -ENOTSUPP;
|
||||
|
||||
return spi_write(spi, data, count);
|
||||
}
|
||||
|
||||
/*
|
||||
* We cannot use regmap-spi generic bus implementation here.
|
||||
* The MC13783 chip will get corrupted if CS signal is deasserted
|
||||
* and on i.Mx31 SoC (the target SoC for MC13783 PMIC) the SPI controller
|
||||
* has the following errata (DSPhl22960):
|
||||
* "The CSPI negates SS when the FIFO becomes empty with
|
||||
* SSCTL= 0. Software cannot guarantee that the FIFO will not
|
||||
* drain because of higher priority interrupts and the
|
||||
* non-realtime characteristics of the operating system. As a
|
||||
* result, the SS will negate before all of the data has been
|
||||
* transferred to/from the peripheral."
|
||||
* We workaround this by accessing the SPI controller with a
|
||||
* single transfert.
|
||||
*/
|
||||
|
||||
static struct regmap_bus regmap_mc13xxx_bus = {
|
||||
.write = mc13xxx_spi_write,
|
||||
.read = mc13xxx_spi_read,
|
||||
};
|
||||
|
||||
static int mc13xxx_spi_probe(struct spi_device *spi)
|
||||
@ -73,12 +135,13 @@ static int mc13xxx_spi_probe(struct spi_device *spi)
|
||||
|
||||
dev_set_drvdata(&spi->dev, mc13xxx);
|
||||
spi->mode = SPI_MODE_0 | SPI_CS_HIGH;
|
||||
spi->bits_per_word = 32;
|
||||
|
||||
mc13xxx->dev = &spi->dev;
|
||||
mutex_init(&mc13xxx->lock);
|
||||
|
||||
mc13xxx->regmap = regmap_init_spi(spi, &mc13xxx_regmap_spi_config);
|
||||
mc13xxx->regmap = regmap_init(&spi->dev, ®map_mc13xxx_bus, &spi->dev,
|
||||
&mc13xxx_regmap_spi_config);
|
||||
|
||||
if (IS_ERR(mc13xxx->regmap)) {
|
||||
ret = PTR_ERR(mc13xxx->regmap);
|
||||
dev_err(mc13xxx->dev, "Failed to initialize register map: %d\n",
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/usb.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
@ -500,8 +501,21 @@ static void omap_usbhs_init(struct device *dev)
|
||||
dev_dbg(dev, "starting TI HSUSB Controller\n");
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
spin_lock_irqsave(&omap->lock, flags);
|
||||
|
||||
if (pdata->ehci_data->phy_reset) {
|
||||
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0]))
|
||||
gpio_request_one(pdata->ehci_data->reset_gpio_port[0],
|
||||
GPIOF_OUT_INIT_LOW, "USB1 PHY reset");
|
||||
|
||||
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1]))
|
||||
gpio_request_one(pdata->ehci_data->reset_gpio_port[1],
|
||||
GPIOF_OUT_INIT_LOW, "USB2 PHY reset");
|
||||
|
||||
/* Hold the PHY in RESET for enough time till DIR is high */
|
||||
udelay(10);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&omap->lock, flags);
|
||||
omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION);
|
||||
dev_dbg(dev, "OMAP UHH_REVISION 0x%x\n", omap->usbhs_rev);
|
||||
|
||||
@ -581,9 +595,39 @@ static void omap_usbhs_init(struct device *dev)
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&omap->lock, flags);
|
||||
|
||||
if (pdata->ehci_data->phy_reset) {
|
||||
/* Hold the PHY in RESET for enough time till
|
||||
* PHY is settled and ready
|
||||
*/
|
||||
udelay(10);
|
||||
|
||||
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0]))
|
||||
gpio_set_value_cansleep
|
||||
(pdata->ehci_data->reset_gpio_port[0], 1);
|
||||
|
||||
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1]))
|
||||
gpio_set_value_cansleep
|
||||
(pdata->ehci_data->reset_gpio_port[1], 1);
|
||||
}
|
||||
|
||||
pm_runtime_put_sync(dev);
|
||||
}
|
||||
|
||||
static void omap_usbhs_deinit(struct device *dev)
|
||||
{
|
||||
struct usbhs_hcd_omap *omap = dev_get_drvdata(dev);
|
||||
struct usbhs_omap_platform_data *pdata = &omap->platdata;
|
||||
|
||||
if (pdata->ehci_data->phy_reset) {
|
||||
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0]))
|
||||
gpio_free(pdata->ehci_data->reset_gpio_port[0]);
|
||||
|
||||
if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1]))
|
||||
gpio_free(pdata->ehci_data->reset_gpio_port[1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* usbhs_omap_probe - initialize TI-based HCDs
|
||||
@ -767,6 +811,7 @@ static int __devinit usbhs_omap_probe(struct platform_device *pdev)
|
||||
goto end_probe;
|
||||
|
||||
err_alloc:
|
||||
omap_usbhs_deinit(&pdev->dev);
|
||||
iounmap(omap->tll_base);
|
||||
|
||||
err_tll:
|
||||
@ -818,6 +863,7 @@ static int __devexit usbhs_omap_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct usbhs_hcd_omap *omap = platform_get_drvdata(pdev);
|
||||
|
||||
omap_usbhs_deinit(&pdev->dev);
|
||||
iounmap(omap->tll_base);
|
||||
iounmap(omap->uhh_base);
|
||||
clk_put(omap->init_60m_fclk);
|
||||
|
@ -356,7 +356,14 @@ static int __devinit palmas_i2c_probe(struct i2c_client *i2c,
|
||||
}
|
||||
}
|
||||
|
||||
ret = regmap_add_irq_chip(palmas->regmap[1], palmas->irq,
|
||||
/* Change IRQ into clear on read mode for efficiency */
|
||||
slave = PALMAS_BASE_TO_SLAVE(PALMAS_INTERRUPT_BASE);
|
||||
addr = PALMAS_BASE_TO_REG(PALMAS_INTERRUPT_BASE, PALMAS_INT_CTRL);
|
||||
reg = PALMAS_INT_CTRL_INT_CLEAR;
|
||||
|
||||
regmap_write(palmas->regmap[slave], addr, reg);
|
||||
|
||||
ret = regmap_add_irq_chip(palmas->regmap[slave], palmas->irq,
|
||||
IRQF_ONESHOT | IRQF_TRIGGER_LOW, -1, &palmas_irq_chip,
|
||||
&palmas->irq_data);
|
||||
if (ret < 0)
|
||||
@ -441,6 +448,9 @@ static int __devinit palmas_i2c_probe(struct i2c_client *i2c,
|
||||
goto err;
|
||||
}
|
||||
|
||||
children[PALMAS_PMIC_ID].platform_data = pdata->pmic_pdata;
|
||||
children[PALMAS_PMIC_ID].pdata_size = sizeof(*pdata->pmic_pdata);
|
||||
|
||||
ret = mfd_add_devices(palmas->dev, -1,
|
||||
children, ARRAY_SIZE(palmas_children),
|
||||
NULL, regmap_irq_chip_get_base(palmas->irq_data));
|
||||
@ -472,6 +482,7 @@ static const struct i2c_device_id palmas_i2c_id[] = {
|
||||
{ "twl6035", },
|
||||
{ "twl6037", },
|
||||
{ "tps65913", },
|
||||
{ /* end */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, palmas_i2c_id);
|
||||
|
||||
|
@ -1147,7 +1147,7 @@ static int mei_pci_resume(struct device *device)
|
||||
err = request_threaded_irq(pdev->irq,
|
||||
NULL,
|
||||
mei_interrupt_thread_handler,
|
||||
0, mei_driver_name, dev);
|
||||
IRQF_ONESHOT, mei_driver_name, dev);
|
||||
else
|
||||
err = request_threaded_irq(pdev->irq,
|
||||
mei_interrupt_quick_handler,
|
||||
|
@ -452,9 +452,9 @@ xpc_handle_activate_mq_msg_uv(struct xpc_partition *part,
|
||||
|
||||
if (msg->activate_gru_mq_desc_gpa !=
|
||||
part_uv->activate_gru_mq_desc_gpa) {
|
||||
spin_lock_irqsave(&part_uv->flags_lock, irq_flags);
|
||||
spin_lock(&part_uv->flags_lock);
|
||||
part_uv->flags &= ~XPC_P_CACHED_ACTIVATE_GRU_MQ_DESC_UV;
|
||||
spin_unlock_irqrestore(&part_uv->flags_lock, irq_flags);
|
||||
spin_unlock(&part_uv->flags_lock);
|
||||
part_uv->activate_gru_mq_desc_gpa =
|
||||
msg->activate_gru_mq_desc_gpa;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user