New package: kernel-rpi-3.6.11 for RPI (a snapshot from today's git next branch).
This commit is contained in:
parent
7a4d75b177
commit
80aa3e4da6
10 changed files with 4392 additions and 0 deletions
1
srcpkgs/kernel-headers-rpi
Symbolic link
1
srcpkgs/kernel-headers-rpi
Symbolic link
|
@ -0,0 +1 @@
|
|||
kernel-rpi
|
12
srcpkgs/kernel-rpi/files/args-uncompressed.txt
Normal file
12
srcpkgs/kernel-rpi/files/args-uncompressed.txt
Normal file
|
@ -0,0 +1,12 @@
|
|||
; kernel args (place at 0x00000100)
|
||||
0x00000005
|
||||
0x54410001
|
||||
0x00000001
|
||||
0x00001000
|
||||
0x00000000
|
||||
0x00000004
|
||||
0x54410002
|
||||
0x08000000
|
||||
0x00000000
|
||||
0x00000000
|
||||
0x00000000
|
17
srcpkgs/kernel-rpi/files/boot-uncompressed.txt
Normal file
17
srcpkgs/kernel-rpi/files/boot-uncompressed.txt
Normal file
|
@ -0,0 +1,17 @@
|
|||
; bootloader (place at 0x00000000)
|
||||
0xea000006
|
||||
0xe1a00000
|
||||
0xe1a00000
|
||||
0xe1a00000
|
||||
0xe1a00000
|
||||
0xe1a00000
|
||||
0xe1a00000
|
||||
0xe1a00000
|
||||
|
||||
0xe3a00000
|
||||
0xe3a01042
|
||||
0xe3811c0c
|
||||
0xe59f2000
|
||||
0xe59ff000
|
||||
0x00000100
|
||||
0x00008000
|
3618
srcpkgs/kernel-rpi/files/config
Normal file
3618
srcpkgs/kernel-rpi/files/config
Normal file
File diff suppressed because it is too large
Load diff
41
srcpkgs/kernel-rpi/files/imagetool-uncompressed.py
Normal file
41
srcpkgs/kernel-rpi/files/imagetool-uncompressed.py
Normal file
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/python2
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
try:
|
||||
linuxdir = sys.argv[1]
|
||||
except:
|
||||
linuxdir = "linux"
|
||||
|
||||
re_line = re.compile(r"0x(?P<value>[0-9a-f]{8})")
|
||||
|
||||
mem = [0 for i in range(32768)]
|
||||
|
||||
def load_to_mem(name, addr):
|
||||
f = open(name)
|
||||
|
||||
for l in f.readlines():
|
||||
m = re_line.match(l)
|
||||
|
||||
if m:
|
||||
value = int(m.group("value"), 16)
|
||||
|
||||
for i in range(4):
|
||||
mem[addr] = int(value >> i * 8 & 0xff)
|
||||
addr += 1
|
||||
|
||||
f.close()
|
||||
|
||||
load_to_mem("boot-uncompressed.txt", 0x00000000)
|
||||
load_to_mem("args-uncompressed.txt", 0x00000100)
|
||||
|
||||
f = open("first32k.bin", "wb")
|
||||
|
||||
for m in mem:
|
||||
f.write(chr(m))
|
||||
|
||||
f.close()
|
||||
|
||||
os.system("cat first32k.bin Image > kernel.img")
|
11
srcpkgs/kernel-rpi/kernel-headers-rpi.template
Normal file
11
srcpkgs/kernel-rpi/kernel-headers-rpi.template
Normal file
|
@ -0,0 +1,11 @@
|
|||
# Template file for 'kernel-headers'.
|
||||
#
|
||||
nostrip=yes
|
||||
noverifyrdeps=yes
|
||||
short_desc="Linux kernel source headers for the RaspberryPI"
|
||||
|
||||
do_install() {
|
||||
vmove usr/src usr
|
||||
vmove usr/lib/modules/${_kernver}/build usr/lib/modules/${_kernver}
|
||||
|
||||
}
|
387
srcpkgs/kernel-rpi/patches/0001-rtc-pcf8523.patch
Normal file
387
srcpkgs/kernel-rpi/patches/0001-rtc-pcf8523.patch
Normal file
|
@ -0,0 +1,387 @@
|
|||
From f803f0d079ded4272d7a1c9813bfd24c58b8ee5f Mon Sep 17 00:00:00 2001
|
||||
From: Thierry Reding <thierry.reding@avionic-design.de>
|
||||
Date: Mon, 17 Dec 2012 16:02:44 -0800
|
||||
Subject: [PATCH] rtc: add NXP PCF8523 support
|
||||
|
||||
Add an RTC driver for PCF8523 chips by NXP Semiconductors. No support is
|
||||
currently provided for the alarm and interrupt functions. Only the time
|
||||
and date functionality is implemented.
|
||||
|
||||
Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
|
||||
Cc: Alessandro Zummo <a.zummo@towertech.it>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
drivers/rtc/Kconfig | 9 ++
|
||||
drivers/rtc/Makefile | 1 +
|
||||
drivers/rtc/rtc-pcf8523.c | 326 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 336 insertions(+), 0 deletions(-)
|
||||
create mode 100644 drivers/rtc/rtc-pcf8523.c
|
||||
|
||||
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
|
||||
index 608a7b1..5bb0314 100644
|
||||
--- drivers/rtc/Kconfig
|
||||
+++ drivers/rtc/Kconfig
|
||||
@@ -269,6 +269,15 @@ config RTC_DRV_X1205
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called rtc-x1205.
|
||||
|
||||
+config RTC_DRV_PCF8523
|
||||
+ tristate "NXP PCF8523"
|
||||
+ help
|
||||
+ If you say yes here you get support for the NXP PCF8523 RTC
|
||||
+ chips.
|
||||
+
|
||||
+ This driver can also be built as a module. If so, the module
|
||||
+ will be called rtc-pcf8523.
|
||||
+
|
||||
config RTC_DRV_PCF8563
|
||||
tristate "Philips PCF8563/Epson RTC8564"
|
||||
help
|
||||
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
|
||||
index 56297f0..59e2132 100644
|
||||
--- drivers/rtc/Makefile
|
||||
+++ drivers/rtc/Makefile
|
||||
@@ -76,6 +76,7 @@ obj-$(CONFIG_RTC_DRV_MV) += rtc-mv.o
|
||||
obj-$(CONFIG_RTC_DRV_NUC900) += rtc-nuc900.o
|
||||
obj-$(CONFIG_RTC_DRV_OMAP) += rtc-omap.o
|
||||
obj-$(CONFIG_RTC_DRV_PCAP) += rtc-pcap.o
|
||||
+obj-$(CONFIG_RTC_DRV_PCF8523) += rtc-pcf8523.o
|
||||
obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o
|
||||
obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o
|
||||
obj-$(CONFIG_RTC_DRV_PCF2123) += rtc-pcf2123.o
|
||||
diff --git a/drivers/rtc/rtc-pcf8523.c b/drivers/rtc/rtc-pcf8523.c
|
||||
new file mode 100644
|
||||
index 0000000..be05a64
|
||||
--- /dev/null
|
||||
+++ drivers/rtc/rtc-pcf8523.c
|
||||
@@ -0,0 +1,326 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2012 Avionic Design GmbH
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License version 2 as
|
||||
+ * published by the Free Software Foundation.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/bcd.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/rtc.h>
|
||||
+#include <linux/of.h>
|
||||
+
|
||||
+#define DRIVER_NAME "rtc-pcf8523"
|
||||
+
|
||||
+#define REG_CONTROL1 0x00
|
||||
+#define REG_CONTROL1_CAP_SEL (1 << 7)
|
||||
+#define REG_CONTROL1_STOP (1 << 5)
|
||||
+
|
||||
+#define REG_CONTROL3 0x02
|
||||
+#define REG_CONTROL3_PM_BLD (1 << 7) /* battery low detection disabled */
|
||||
+#define REG_CONTROL3_PM_VDD (1 << 6) /* switch-over disabled */
|
||||
+#define REG_CONTROL3_PM_DSM (1 << 5) /* direct switching mode */
|
||||
+#define REG_CONTROL3_PM_MASK 0xe0
|
||||
+
|
||||
+#define REG_SECONDS 0x03
|
||||
+#define REG_SECONDS_OS (1 << 7)
|
||||
+
|
||||
+#define REG_MINUTES 0x04
|
||||
+#define REG_HOURS 0x05
|
||||
+#define REG_DAYS 0x06
|
||||
+#define REG_WEEKDAYS 0x07
|
||||
+#define REG_MONTHS 0x08
|
||||
+#define REG_YEARS 0x09
|
||||
+
|
||||
+struct pcf8523 {
|
||||
+ struct rtc_device *rtc;
|
||||
+};
|
||||
+
|
||||
+static int pcf8523_read(struct i2c_client *client, u8 reg, u8 *valuep)
|
||||
+{
|
||||
+ struct i2c_msg msgs[2];
|
||||
+ u8 value = 0;
|
||||
+ int err;
|
||||
+
|
||||
+ msgs[0].addr = client->addr;
|
||||
+ msgs[0].flags = 0;
|
||||
+ msgs[0].len = sizeof(reg);
|
||||
+ msgs[0].buf = ®
|
||||
+
|
||||
+ msgs[1].addr = client->addr;
|
||||
+ msgs[1].flags = I2C_M_RD;
|
||||
+ msgs[1].len = sizeof(value);
|
||||
+ msgs[1].buf = &value;
|
||||
+
|
||||
+ err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ *valuep = value;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int pcf8523_write(struct i2c_client *client, u8 reg, u8 value)
|
||||
+{
|
||||
+ u8 buffer[2] = { reg, value };
|
||||
+ struct i2c_msg msg;
|
||||
+ int err;
|
||||
+
|
||||
+ msg.addr = client->addr;
|
||||
+ msg.flags = 0;
|
||||
+ msg.len = sizeof(buffer);
|
||||
+ msg.buf = buffer;
|
||||
+
|
||||
+ err = i2c_transfer(client->adapter, &msg, 1);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int pcf8523_select_capacitance(struct i2c_client *client, bool high)
|
||||
+{
|
||||
+ u8 value;
|
||||
+ int err;
|
||||
+
|
||||
+ err = pcf8523_read(client, REG_CONTROL1, &value);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ if (!high)
|
||||
+ value &= ~REG_CONTROL1_CAP_SEL;
|
||||
+ else
|
||||
+ value |= REG_CONTROL1_CAP_SEL;
|
||||
+
|
||||
+ err = pcf8523_write(client, REG_CONTROL1, value);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+static int pcf8523_set_pm(struct i2c_client *client, u8 pm)
|
||||
+{
|
||||
+ u8 value;
|
||||
+ int err;
|
||||
+
|
||||
+ err = pcf8523_read(client, REG_CONTROL3, &value);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ value = (value & ~REG_CONTROL3_PM_MASK) | pm;
|
||||
+
|
||||
+ err = pcf8523_write(client, REG_CONTROL3, value);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int pcf8523_stop_rtc(struct i2c_client *client)
|
||||
+{
|
||||
+ u8 value;
|
||||
+ int err;
|
||||
+
|
||||
+ err = pcf8523_read(client, REG_CONTROL1, &value);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ value |= REG_CONTROL1_STOP;
|
||||
+
|
||||
+ err = pcf8523_write(client, REG_CONTROL1, value);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int pcf8523_start_rtc(struct i2c_client *client)
|
||||
+{
|
||||
+ u8 value;
|
||||
+ int err;
|
||||
+
|
||||
+ err = pcf8523_read(client, REG_CONTROL1, &value);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ value &= ~REG_CONTROL1_STOP;
|
||||
+
|
||||
+ err = pcf8523_write(client, REG_CONTROL1, value);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
+{
|
||||
+ struct i2c_client *client = to_i2c_client(dev);
|
||||
+ u8 start = REG_SECONDS, regs[7];
|
||||
+ struct i2c_msg msgs[2];
|
||||
+ int err;
|
||||
+
|
||||
+ msgs[0].addr = client->addr;
|
||||
+ msgs[0].flags = 0;
|
||||
+ msgs[0].len = 1;
|
||||
+ msgs[0].buf = &start;
|
||||
+
|
||||
+ msgs[1].addr = client->addr;
|
||||
+ msgs[1].flags = I2C_M_RD;
|
||||
+ msgs[1].len = sizeof(regs);
|
||||
+ msgs[1].buf = regs;
|
||||
+
|
||||
+ err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ if (regs[0] & REG_SECONDS_OS) {
|
||||
+ /*
|
||||
+ * If the oscillator was stopped, try to clear the flag. Upon
|
||||
+ * power-up the flag is always set, but if we cannot clear it
|
||||
+ * the oscillator isn't running properly for some reason. The
|
||||
+ * sensible thing therefore is to return an error, signalling
|
||||
+ * that the clock cannot be assumed to be correct.
|
||||
+ */
|
||||
+
|
||||
+ regs[0] &= ~REG_SECONDS_OS;
|
||||
+
|
||||
+ err = pcf8523_write(client, REG_SECONDS, regs[0]);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = pcf8523_read(client, REG_SECONDS, ®s[0]);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ if (regs[0] & REG_SECONDS_OS)
|
||||
+ return -EAGAIN;
|
||||
+ }
|
||||
+
|
||||
+ tm->tm_sec = bcd2bin(regs[0] & 0x7f);
|
||||
+ tm->tm_min = bcd2bin(regs[1] & 0x7f);
|
||||
+ tm->tm_hour = bcd2bin(regs[2] & 0x3f);
|
||||
+ tm->tm_mday = bcd2bin(regs[3] & 0x3f);
|
||||
+ tm->tm_wday = regs[4] & 0x7;
|
||||
+ tm->tm_mon = bcd2bin(regs[5] & 0x1f);
|
||||
+ tm->tm_year = bcd2bin(regs[6]) + 100;
|
||||
+
|
||||
+ return rtc_valid_tm(tm);
|
||||
+}
|
||||
+
|
||||
+static int pcf8523_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
+{
|
||||
+ struct i2c_client *client = to_i2c_client(dev);
|
||||
+ struct i2c_msg msg;
|
||||
+ u8 regs[8];
|
||||
+ int err;
|
||||
+
|
||||
+ err = pcf8523_stop_rtc(client);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ regs[0] = REG_SECONDS;
|
||||
+ regs[1] = bin2bcd(tm->tm_sec);
|
||||
+ regs[2] = bin2bcd(tm->tm_min);
|
||||
+ regs[3] = bin2bcd(tm->tm_hour);
|
||||
+ regs[4] = bin2bcd(tm->tm_mday);
|
||||
+ regs[5] = tm->tm_wday;
|
||||
+ regs[6] = bin2bcd(tm->tm_mon);
|
||||
+ regs[7] = bin2bcd(tm->tm_year - 100);
|
||||
+
|
||||
+ msg.addr = client->addr;
|
||||
+ msg.flags = 0;
|
||||
+ msg.len = sizeof(regs);
|
||||
+ msg.buf = regs;
|
||||
+
|
||||
+ err = i2c_transfer(client->adapter, &msg, 1);
|
||||
+ if (err < 0) {
|
||||
+ /*
|
||||
+ * If the time cannot be set, restart the RTC anyway. Note
|
||||
+ * that errors are ignored if the RTC cannot be started so
|
||||
+ * that we have a chance to propagate the original error.
|
||||
+ */
|
||||
+ pcf8523_start_rtc(client);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
+ return pcf8523_start_rtc(client);
|
||||
+}
|
||||
+
|
||||
+static const struct rtc_class_ops pcf8523_rtc_ops = {
|
||||
+ .read_time = pcf8523_rtc_read_time,
|
||||
+ .set_time = pcf8523_rtc_set_time,
|
||||
+};
|
||||
+
|
||||
+static int pcf8523_probe(struct i2c_client *client,
|
||||
+ const struct i2c_device_id *id)
|
||||
+{
|
||||
+ struct pcf8523 *pcf;
|
||||
+ int err;
|
||||
+
|
||||
+ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ pcf = devm_kzalloc(&client->dev, sizeof(*pcf), GFP_KERNEL);
|
||||
+ if (!pcf)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ err = pcf8523_select_capacitance(client, true);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ err = pcf8523_set_pm(client, 0);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ pcf->rtc = rtc_device_register(DRIVER_NAME, &client->dev,
|
||||
+ &pcf8523_rtc_ops, THIS_MODULE);
|
||||
+ if (IS_ERR(pcf->rtc))
|
||||
+ return PTR_ERR(pcf->rtc);
|
||||
+
|
||||
+ i2c_set_clientdata(client, pcf);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int pcf8523_remove(struct i2c_client *client)
|
||||
+{
|
||||
+ struct pcf8523 *pcf = i2c_get_clientdata(client);
|
||||
+
|
||||
+ rtc_device_unregister(pcf->rtc);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct i2c_device_id pcf8523_id[] = {
|
||||
+ { "pcf8523", 0 },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(i2c, pcf8523_id);
|
||||
+
|
||||
+#ifdef CONFIG_OF
|
||||
+static const struct of_device_id pcf8523_of_match[] = {
|
||||
+ { .compatible = "nxp,pcf8523" },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, pcf8523_of_match);
|
||||
+#endif
|
||||
+
|
||||
+static struct i2c_driver pcf8523_driver = {
|
||||
+ .driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .of_match_table = of_match_ptr(pcf8523_of_match),
|
||||
+ },
|
||||
+ .probe = pcf8523_probe,
|
||||
+ .remove = pcf8523_remove,
|
||||
+ .id_table = pcf8523_id,
|
||||
+};
|
||||
+module_i2c_driver(pcf8523_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Thierry Reding <thierry.reding@avionic-design.de>");
|
||||
+MODULE_DESCRIPTION("NXP PCF8523 RTC driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
--
|
||||
1.7.6.5
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
diff --git a/arch/arm/mach-bcm2708/bcm2708.c b/arch/arm/mach-bcm2708/bcm2708.c
|
||||
index 7fe7283..a8e31e7 100644
|
||||
--- arch/arm/mach-bcm2708/bcm2708.c
|
||||
+++ arch/arm/mach-bcm2708/bcm2708.c
|
||||
@@ -689,6 +689,21 @@ static void bcm2708_power_off(void)
|
||||
bcm2708_restart(0, "");
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_RTC_DRV_PCF8523
|
||||
+static struct i2c_board_info offboard_i2c_devices[] = {
|
||||
+ {
|
||||
+ /* Raspy Juice real-time clock chip */
|
||||
+ I2C_BOARD_INFO("pcf8523", 0x68),
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+#if defined(CONFIG_RTC_HCTOSYS) && \
|
||||
+ (!defined(CONFIG_I2C_CHARDEV) || \
|
||||
+ !defined(CONFIG_I2C_BCM2708))
|
||||
+#error "RTC_DRV_PCF8523 defined as kernel built-in, but I2C_CHARDEV and I2C_BMC2708 isn't: RTC_HCTOSYS will not work."
|
||||
+#endif
|
||||
+#endif
|
||||
+
|
||||
void __init bcm2708_init(void)
|
||||
{
|
||||
int i;
|
||||
@@ -752,6 +767,15 @@ void __init bcm2708_init(void)
|
||||
spi_register_board_info(bcm2708_spi_devices,
|
||||
ARRAY_SIZE(bcm2708_spi_devices));
|
||||
#endif
|
||||
+
|
||||
+#ifdef CONFIG_RTC_DRV_PCF8523
|
||||
+ i = 0;
|
||||
+ /* test of Raspberry Pi Rev.2, where GPIO-header I2C busnum=1 */
|
||||
+ if (system_rev >= 15)
|
||||
+ i = 1;
|
||||
+ i2c_register_board_info(i, offboard_i2c_devices,
|
||||
+ ARRAY_SIZE(offboard_i2c_devices));
|
||||
+#endif
|
||||
}
|
||||
|
||||
#define TIMER_PERIOD DIV_ROUND_CLOSEST(STC_FREQ_HZ, HZ)
|
|
@ -0,0 +1,98 @@
|
|||
commit 2394d67e446bf616a0885167d5f0d397bdacfdfc
|
||||
Author: Oliver Neukum <oneukum@suse.de>
|
||||
Date: Tue Sep 13 08:42:21 2011 +0200
|
||||
|
||||
USB: add RESET_RESUME for webcams shown to be quirky
|
||||
|
||||
The new runtime PM code has shown that many webcams suffer
|
||||
from a race condition that may crash them upon resume.
|
||||
Runtime PM is especially prone to show the problem because
|
||||
it retains power to the cameras at all times. However
|
||||
system suspension may also crash the devices and retain
|
||||
power to the devices.
|
||||
The only way to solve this problem without races is in
|
||||
usbcore with the RESET_RESUME quirk.
|
||||
|
||||
Signed-off-by: Oliver Neukum <oneukum@suse.de>
|
||||
Signed-off-by: stable <stable@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
||||
index 81ce6a8..38f0510 100644
|
||||
--- drivers/usb/core/quirks.c
|
||||
+++ drivers/usb/core/quirks.c
|
||||
@@ -38,6 +38,24 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Creative SB Audigy 2 NX */
|
||||
{ USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
+ /* Logitech Webcam C200 */
|
||||
+ { USB_DEVICE(0x046d, 0x0802), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
+ /* Logitech Webcam C250 */
|
||||
+ { USB_DEVICE(0x046d, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
+ /* Logitech Webcam B/C500 */
|
||||
+ { USB_DEVICE(0x046d, 0x0807), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
+ /* Logitech Webcam Pro 9000 */
|
||||
+ { USB_DEVICE(0x046d, 0x0809), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
+ /* Logitech Webcam C310 */
|
||||
+ { USB_DEVICE(0x046d, 0x081b), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
+ /* Logitech Webcam C270 */
|
||||
+ { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
/* Logitech Harmony 700-series */
|
||||
{ USB_DEVICE(0x046d, 0xc122), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
@@ -69,6 +87,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
{ USB_DEVICE(0x06a3, 0x0006), .driver_info =
|
||||
USB_QUIRK_CONFIG_INTF_STRINGS },
|
||||
|
||||
+ /* Guillemot Webcam Hercules Dualpix Exchange*/
|
||||
+ { USB_DEVICE(0x06f8, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
/* M-Systems Flash Disk Pioneers */
|
||||
{ USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
commit 5b253d88cc6c65a23cefc457a5a4ef139913c5fc
|
||||
Author: Jon Levell <linuxusb@coralbark.net>
|
||||
Date: Thu Sep 29 20:42:52 2011 +0100
|
||||
|
||||
USB: add quirk for Logitech C300 web cam
|
||||
|
||||
My webcam is a Logitech C300 and I get "chipmunk"ed squeaky sound.
|
||||
The following trivial patch fixes it.
|
||||
|
||||
Signed-off-by: Jon Levell <linuxusb@coralbark.net>
|
||||
Cc: stable <stable@kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
||||
index 38f0510..d6a8d82 100644
|
||||
--- drivers/usb/core/quirks.c
|
||||
+++ drivers/usb/core/quirks.c
|
||||
@@ -44,6 +44,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Logitech Webcam C250 */
|
||||
{ USB_DEVICE(0x046d, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
+ /* Logitech Webcam C300 */
|
||||
+ { USB_DEVICE(0x046d, 0x0805), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
/* Logitech Webcam B/C500 */
|
||||
{ USB_DEVICE(0x046d, 0x0807), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
||||
index d6a8d82..caa1991 100644
|
||||
--- drivers/usb/core/quirks.c
|
||||
+++ drivers/usb/core/quirks.c
|
||||
@@ -50,6 +50,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* Logitech Webcam B/C500 */
|
||||
{ USB_DEVICE(0x046d, 0x0807), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
+ /* Logitech Webcam C600 */
|
||||
+ { USB_DEVICE(0x046d, 0x0808), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
/* Logitech Webcam Pro 9000 */
|
||||
{ USB_DEVICE(0x046d, 0x0809), .driver_info = USB_QUIRK_RESET_RESUME },
|
165
srcpkgs/kernel-rpi/template
Normal file
165
srcpkgs/kernel-rpi/template
Normal file
|
@ -0,0 +1,165 @@
|
|||
# Template file for 'kernel-rpi'
|
||||
#
|
||||
pkgname=kernel-rpi
|
||||
version=3.6.11
|
||||
revision=1
|
||||
wrksrc="linux-95009dbb77849634cefea237dc952881406b0119"
|
||||
maintainer="Juan RP <xtraeme@gmail.com>"
|
||||
homepage="http://www.kernel.org"
|
||||
license="GPL-2"
|
||||
short_desc="The Linux kernel and modules for the Raspberry Pi"
|
||||
distfiles="http://xbps.nopcode.org/distfiles/linux-rpi-20130219.tar.xz"
|
||||
checksum=930176da46b88ebff880ae6f0b397b78a60e23670edcbc821e82e19bcada4c56
|
||||
|
||||
nostrip=yes
|
||||
noverifyrdeps=yes
|
||||
provides="kernel-${version}"
|
||||
subpackages="kernel-headers-rpi"
|
||||
triggers="kernel-hooks"
|
||||
|
||||
depends="kmod>=11_2"
|
||||
makedepends="perl python kmod>=11_2 uboot-mkimage"
|
||||
only_for_archs="armv6l"
|
||||
|
||||
_kernver="${version}_${revision}"
|
||||
|
||||
# These files could be modified when an external module is built.
|
||||
mutable_files="
|
||||
/usr/lib/modules/${_kernver}/modules.dep
|
||||
/usr/lib/modules/${_kernver}/modules.dep.bin
|
||||
/usr/lib/modules/${_kernver}/modules.symbols
|
||||
/usr/lib/modules/${_kernver}/modules.symbols.bin
|
||||
/usr/lib/modules/${_kernver}/modules.alias
|
||||
/usr/lib/modules/${_kernver}/modules.alias.bin
|
||||
/usr/lib/modules/${_kernver}/modules.devname"
|
||||
|
||||
do_build() {
|
||||
if [ -n "$XBPS_CROSS_TRIPLET" ]; then
|
||||
_args="CCPREFIX=${XBPS_CROSS_TRIPLET}- CROSS_COMPILE=${XBPS_CROSS_TRIPLET}-"
|
||||
fi
|
||||
|
||||
# Copy required files to create the bootable image.
|
||||
cp ${FILESDIR}/args-uncompressed.txt arch/arm/boot/
|
||||
cp ${FILESDIR}/boot-uncompressed.txt arch/arm/boot/
|
||||
cp ${FILESDIR}/imagetool-uncompressed.py arch/arm/boot/
|
||||
|
||||
# Copy our kernel config and update if it's needed.
|
||||
cp -f ${FILESDIR}/config .config
|
||||
make ${makejobs} ${_args} ARCH=arm oldconfig
|
||||
|
||||
# Always use our revision to CONFIG_LOCALVERSION to match our pkg version.
|
||||
sed -i -e "s|^\(CONFIG_LOCALVERSION=\).*|\1\"_${revision}\"|" .config
|
||||
|
||||
make ${makejobs} ${_args} ARCH=arm prepare
|
||||
make ${makejobs} ${_args} ARCH=arm uImage modules
|
||||
}
|
||||
|
||||
do_install() {
|
||||
local hdrdest
|
||||
|
||||
# Run depmod after compressing modules.
|
||||
sed -i '2iexit 0' scripts/depmod.sh
|
||||
|
||||
# Install kernel, firmware and modules
|
||||
make ARCH=arm INSTALL_MOD_PATH=${DESTDIR} modules_install
|
||||
|
||||
# Generate kernel.img and install it to destdir.
|
||||
cd arch/arm/boot
|
||||
/usr/bin/python2 imagetool-uncompressed.py
|
||||
cd ${wrksrc}
|
||||
vinstall arch/arm/boot/kernel.img 644 boot
|
||||
|
||||
hdrdest=${DESTDIR}/usr/src/kernel-headers-rpi-${_kernver}
|
||||
|
||||
# Switch to /usr.
|
||||
vmkdir usr
|
||||
vmove lib usr
|
||||
|
||||
cd ${DESTDIR}/usr/lib/modules/${_kernver} && \
|
||||
rm -f source build && \
|
||||
ln -sf ../../../src/kernel-headers-rpi-${_kernver} build
|
||||
|
||||
cd ${wrksrc}
|
||||
# Install required headers to build external modules
|
||||
install -Dm644 Makefile ${hdrdest}/Makefile
|
||||
install -Dm644 kernel/Makefile ${hdrdest}/kernel/Makefile
|
||||
install -Dm644 .config ${hdrdest}/.config
|
||||
mkdir -p ${hdrdest}/include
|
||||
|
||||
# Remove firmware stuff provided by the "linux-firmware" pkg.
|
||||
rm -rf ${DESTDIR}/usr/lib/firmware
|
||||
|
||||
for i in acpi asm-generic config crypto drm generated linux math-emu \
|
||||
media net pcmcia scsi sound trace video xen; do
|
||||
[ -d include/$i ] && cp -a include/$i ${hdrdest}/include
|
||||
done
|
||||
|
||||
cd ${wrksrc}
|
||||
# Copy files necessary for later builds.
|
||||
cp Module.symvers ${hdrdest}
|
||||
cp -a scripts ${hdrdest}
|
||||
|
||||
# fix permissions on scripts dir
|
||||
chmod og-w -R ${hdrdest}/scripts
|
||||
|
||||
# copy arch includes for external modules
|
||||
mkdir -p ${hdrdest}/arch/arm/mach-bcm2708
|
||||
cp -a arch/arm/include ${hdrdest}/arch/arm
|
||||
cp -a arch/arm/mach-bcm2708/include ${hdrdest}/arch/arm/mach-bcm2708
|
||||
|
||||
mkdir -p ${hdrdest}/arch/arm/kernel
|
||||
|
||||
cp arch/arm/Makefile ${hdrdest}/arch/arm
|
||||
if [ "$MACHINE_ARCH" = "i686" ]; then
|
||||
cp arch/arm/Makefile_32.cpu ${hdrdest}/arch/arm
|
||||
fi
|
||||
cp arch/arm/kernel/asm-offsets.s ${hdrdest}/arch/arm/kernel
|
||||
|
||||
# add headers for lirc package
|
||||
mkdir -p ${hdrdest}/drivers/media/video
|
||||
cp drivers/media/video/*.h ${hdrdest}/drivers/media/video/
|
||||
|
||||
for i in bt8xx cpia2 cx25840 cx88 em28xx pwc saa7134 sn9c102; do
|
||||
mkdir -p ${hdrdest}/drivers/media/video/${i}
|
||||
cp -a drivers/media/video/${i}/*.h ${hdrdest}/drivers/media/video/${i}
|
||||
done
|
||||
|
||||
# Add docbook makefile
|
||||
install -Dm644 Documentation/DocBook/Makefile \
|
||||
${hdrdest}/Documentation/DocBook/Makefile
|
||||
|
||||
# Add md headers
|
||||
mkdir -p ${hdrdest}/drivers/md
|
||||
cp drivers/md/*.h ${hdrdest}/drivers/md
|
||||
|
||||
# Add inotify.h
|
||||
mkdir -p ${hdrdest}/include/linux
|
||||
cp include/linux/inotify.h ${hdrdest}/include/linux
|
||||
|
||||
# Add wireless headers
|
||||
mkdir -p ${hdrdest}/net/mac80211/
|
||||
cp net/mac80211/*.h ${hdrdest}/net/mac80211
|
||||
|
||||
# add dvb headers for external modules
|
||||
mkdir -p ${hdrdest}/include/config/dvb/
|
||||
cp include/config/dvb/*.h ${hdrdest}/include/config/dvb/
|
||||
|
||||
# Copy in Kconfig files
|
||||
for i in $(find . -name "Kconfig*"); do
|
||||
mkdir -p ${hdrdest}/$(echo $i | sed 's|/Kconfig.*||')
|
||||
cp $i ${hdrdest}/$i
|
||||
done
|
||||
|
||||
# Remove unneeded architectures
|
||||
for arch in alpha arm26 avr32 blackfin cris frv h8300 \
|
||||
ia64 m* p* s* um v850 x86 xtensa; do
|
||||
rm -rf ${hdrdest}/arch/${arch}
|
||||
done
|
||||
|
||||
# Compress all modules with xz to save a few MBs.
|
||||
msg_normal "$pkgver: compressing kernel modules with gzip, please wait...\n"
|
||||
find ${DESTDIR} -name '*.ko' -exec gzip -9 {} \;
|
||||
|
||||
# ... and run depmod again.
|
||||
depmod -b ${DESTDIR}/usr -F System.map ${_kernver}
|
||||
}
|
Loading…
Reference in a new issue