You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
+11
-3
@@ -323,7 +323,7 @@ config SPECIALIX
|
||||
|
||||
config SX
|
||||
tristate "Specialix SX (and SI) card support"
|
||||
depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA)
|
||||
depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) && BROKEN
|
||||
help
|
||||
This is a driver for the SX and SI multiport serial cards.
|
||||
Please read the file <file:Documentation/serial/sx.txt> for details.
|
||||
@@ -334,7 +334,7 @@ config SX
|
||||
|
||||
config RIO
|
||||
tristate "Specialix RIO system support"
|
||||
depends on SERIAL_NONSTANDARD
|
||||
depends on SERIAL_NONSTANDARD && BROKEN
|
||||
help
|
||||
This is a driver for the Specialix RIO, a smart serial card which
|
||||
drives an outboard box that can support up to 128 ports. Product
|
||||
@@ -395,7 +395,7 @@ config NOZOMI
|
||||
|
||||
config A2232
|
||||
tristate "Commodore A2232 serial support (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP
|
||||
depends on EXPERIMENTAL && ZORRO && BROKEN
|
||||
---help---
|
||||
This option supports the 2232 7-port serial card shipped with the
|
||||
Amiga 2000 and other Zorro-bus machines, dating from 1989. At
|
||||
@@ -1087,6 +1087,14 @@ config MMTIMER
|
||||
The mmtimer device allows direct userspace access to the
|
||||
Altix system timer.
|
||||
|
||||
config UV_MMTIMER
|
||||
tristate "UV_MMTIMER Memory mapped RTC for SGI UV"
|
||||
depends on X86_UV
|
||||
default m
|
||||
help
|
||||
The uv_mmtimer device allows direct userspace access to the
|
||||
UV system timer.
|
||||
|
||||
source "drivers/char/tpm/Kconfig"
|
||||
|
||||
config TELCLOCK
|
||||
|
||||
@@ -58,6 +58,7 @@ obj-$(CONFIG_RAW_DRIVER) += raw.o
|
||||
obj-$(CONFIG_SGI_SNSC) += snsc.o snsc_event.o
|
||||
obj-$(CONFIG_MSPEC) += mspec.o
|
||||
obj-$(CONFIG_MMTIMER) += mmtimer.o
|
||||
obj-$(CONFIG_UV_MMTIMER) += uv_mmtimer.o
|
||||
obj-$(CONFIG_VIOTAPE) += viotape.o
|
||||
obj-$(CONFIG_HVCS) += hvcs.o
|
||||
obj-$(CONFIG_IBM_BSR) += bsr.o
|
||||
|
||||
@@ -131,7 +131,7 @@ struct agp_bridge_driver {
|
||||
struct agp_bridge_data {
|
||||
const struct agp_version *version;
|
||||
const struct agp_bridge_driver *driver;
|
||||
struct vm_operations_struct *vm_ops;
|
||||
const struct vm_operations_struct *vm_ops;
|
||||
void *previous_size;
|
||||
void *current_size;
|
||||
void *dev_private_data;
|
||||
|
||||
@@ -40,7 +40,7 @@ static struct aper_size_info_fixed alpha_core_agp_sizes[] =
|
||||
{ 0, 0, 0 }, /* filled in by alpha_core_agp_setup */
|
||||
};
|
||||
|
||||
struct vm_operations_struct alpha_core_agp_vm_ops = {
|
||||
static const struct vm_operations_struct alpha_core_agp_vm_ops = {
|
||||
.fault = alpha_core_agp_vm_fault,
|
||||
};
|
||||
|
||||
|
||||
@@ -114,9 +114,9 @@ static int agp_find_max(void)
|
||||
long memory, index, result;
|
||||
|
||||
#if PAGE_SHIFT < 20
|
||||
memory = num_physpages >> (20 - PAGE_SHIFT);
|
||||
memory = totalram_pages >> (20 - PAGE_SHIFT);
|
||||
#else
|
||||
memory = num_physpages << (PAGE_SHIFT - 20);
|
||||
memory = totalram_pages << (PAGE_SHIFT - 20);
|
||||
#endif
|
||||
index = 1;
|
||||
|
||||
|
||||
@@ -476,7 +476,6 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
|
||||
{
|
||||
acpi_handle handle, parent;
|
||||
acpi_status status;
|
||||
struct acpi_buffer buffer;
|
||||
struct acpi_device_info *info;
|
||||
u64 lba_hpa, sba_hpa, length;
|
||||
int match;
|
||||
@@ -488,13 +487,11 @@ zx1_gart_probe (acpi_handle obj, u32 depth, void *context, void **ret)
|
||||
/* Look for an enclosing IOC scope and find its CSR space */
|
||||
handle = obj;
|
||||
do {
|
||||
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||
status = acpi_get_object_info(handle, &buffer);
|
||||
status = acpi_get_object_info(handle, &info);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
/* TBD check _CID also */
|
||||
info = buffer.pointer;
|
||||
info->hardware_id.value[sizeof(info->hardware_id)-1] = '\0';
|
||||
match = (strcmp(info->hardware_id.value, "HWP0001") == 0);
|
||||
info->hardware_id.string[sizeof(info->hardware_id.length)-1] = '\0';
|
||||
match = (strcmp(info->hardware_id.string, "HWP0001") == 0);
|
||||
kfree(info);
|
||||
if (match) {
|
||||
status = hp_acpi_csr_space(handle, &sba_hpa, &length);
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
#define PCI_DEVICE_ID_INTEL_Q35_IG 0x29B2
|
||||
#define PCI_DEVICE_ID_INTEL_Q33_HB 0x29D0
|
||||
#define PCI_DEVICE_ID_INTEL_Q33_IG 0x29D2
|
||||
#define PCI_DEVICE_ID_INTEL_B43_HB 0x2E40
|
||||
#define PCI_DEVICE_ID_INTEL_B43_IG 0x2E42
|
||||
#define PCI_DEVICE_ID_INTEL_GM45_HB 0x2A40
|
||||
#define PCI_DEVICE_ID_INTEL_GM45_IG 0x2A42
|
||||
#define PCI_DEVICE_ID_INTEL_IGD_E_HB 0x2E00
|
||||
@@ -60,6 +62,7 @@
|
||||
#define PCI_DEVICE_ID_INTEL_IGDNG_D_IG 0x0042
|
||||
#define PCI_DEVICE_ID_INTEL_IGDNG_M_HB 0x0044
|
||||
#define PCI_DEVICE_ID_INTEL_IGDNG_MA_HB 0x0062
|
||||
#define PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB 0x006a
|
||||
#define PCI_DEVICE_ID_INTEL_IGDNG_M_IG 0x0046
|
||||
|
||||
/* cover 915 and 945 variants */
|
||||
@@ -91,9 +94,11 @@
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_B43_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_D_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_M_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB)
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MA_HB || \
|
||||
agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB)
|
||||
|
||||
extern int agp_memory_reserved;
|
||||
|
||||
@@ -804,23 +809,39 @@ static void intel_i830_setup_flush(void)
|
||||
if (!intel_private.i8xx_page)
|
||||
return;
|
||||
|
||||
/* make page uncached */
|
||||
map_page_into_agp(intel_private.i8xx_page);
|
||||
|
||||
intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page);
|
||||
if (!intel_private.i8xx_flush_page)
|
||||
intel_i830_fini_flush();
|
||||
}
|
||||
|
||||
static void
|
||||
do_wbinvd(void *null)
|
||||
{
|
||||
wbinvd();
|
||||
}
|
||||
|
||||
/* The chipset_flush interface needs to get data that has already been
|
||||
* flushed out of the CPU all the way out to main memory, because the GPU
|
||||
* doesn't snoop those buffers.
|
||||
*
|
||||
* The 8xx series doesn't have the same lovely interface for flushing the
|
||||
* chipset write buffers that the later chips do. According to the 865
|
||||
* specs, it's 64 octwords, or 1KB. So, to get those previous things in
|
||||
* that buffer out, we just fill 1KB and clflush it out, on the assumption
|
||||
* that it'll push whatever was in there out. It appears to work.
|
||||
*/
|
||||
static void intel_i830_chipset_flush(struct agp_bridge_data *bridge)
|
||||
{
|
||||
unsigned int *pg = intel_private.i8xx_flush_page;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 256; i += 2)
|
||||
*(pg + i) = i;
|
||||
memset(pg, 0, 1024);
|
||||
|
||||
wmb();
|
||||
if (cpu_has_clflush) {
|
||||
clflush_cache_range(pg, 1024);
|
||||
} else {
|
||||
if (on_each_cpu(do_wbinvd, NULL, 1) != 0)
|
||||
printk(KERN_ERR "Timed out waiting for cache flush.\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* The intel i830 automatically initializes the agp aperture during POST.
|
||||
@@ -1142,12 +1163,6 @@ static int intel_i915_configure(void)
|
||||
|
||||
intel_i9xx_setup_flush();
|
||||
|
||||
#ifdef USE_PCI_DMA_API
|
||||
if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(36)))
|
||||
dev_err(&intel_private.pcidev->dev,
|
||||
"set gfx device dma mask 36bit failed!\n");
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1341,9 +1356,11 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size)
|
||||
case PCI_DEVICE_ID_INTEL_Q45_HB:
|
||||
case PCI_DEVICE_ID_INTEL_G45_HB:
|
||||
case PCI_DEVICE_ID_INTEL_G41_HB:
|
||||
case PCI_DEVICE_ID_INTEL_B43_HB:
|
||||
case PCI_DEVICE_ID_INTEL_IGDNG_D_HB:
|
||||
case PCI_DEVICE_ID_INTEL_IGDNG_M_HB:
|
||||
case PCI_DEVICE_ID_INTEL_IGDNG_MA_HB:
|
||||
case PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB:
|
||||
*gtt_offset = *gtt_size = MB(2);
|
||||
break;
|
||||
default:
|
||||
@@ -2335,6 +2352,8 @@ static const struct intel_driver_description {
|
||||
"Q45/Q43", NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_G45_HB, PCI_DEVICE_ID_INTEL_G45_IG, 0,
|
||||
"G45/G43", NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_B43_HB, PCI_DEVICE_ID_INTEL_B43_IG, 0,
|
||||
"B43", NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0,
|
||||
"G41", NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_IGDNG_D_HB, PCI_DEVICE_ID_INTEL_IGDNG_D_IG, 0,
|
||||
@@ -2343,6 +2362,8 @@ static const struct intel_driver_description {
|
||||
"IGDNG/M", NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_IGDNG_MA_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0,
|
||||
"IGDNG/MA", NULL, &intel_i965_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB, PCI_DEVICE_ID_INTEL_IGDNG_M_IG, 0,
|
||||
"IGDNG/MC2", NULL, &intel_i965_driver },
|
||||
{ 0, 0, 0, NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
@@ -2434,6 +2455,11 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev,
|
||||
&bridge->mode);
|
||||
}
|
||||
|
||||
if (bridge->driver->mask_memory == intel_i965_mask_memory)
|
||||
if (pci_set_dma_mask(intel_private.pcidev, DMA_BIT_MASK(36)))
|
||||
dev_err(&intel_private.pcidev->dev,
|
||||
"set gfx device dma mask 36bit failed!\n");
|
||||
|
||||
pci_set_drvdata(pdev, bridge);
|
||||
return agp_add_bridge(bridge);
|
||||
}
|
||||
@@ -2535,9 +2561,11 @@ static struct pci_device_id agp_intel_pci_table[] = {
|
||||
ID(PCI_DEVICE_ID_INTEL_Q45_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_G45_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_G41_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_B43_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_IGDNG_D_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_IGDNG_M_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_IGDNG_MA_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_IGDNG_MC2_HB),
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -217,7 +217,7 @@ static const struct agp_bridge_driver parisc_agp_driver = {
|
||||
.configure = parisc_agp_configure,
|
||||
.fetch_size = parisc_agp_fetch_size,
|
||||
.tlb_flush = parisc_agp_tlbflush,
|
||||
.mask_memory = parisc_agp_page_mask_memory,
|
||||
.mask_memory = parisc_agp_mask_memory,
|
||||
.masks = parisc_agp_masks,
|
||||
.agp_enable = parisc_agp_enable,
|
||||
.cache_flush = global_cache_flush,
|
||||
|
||||
@@ -270,7 +270,7 @@ static void uninorth_agp_enable(struct agp_bridge_data *bridge, u32 mode)
|
||||
|
||||
if ((uninorth_rev >= 0x30) && (uninorth_rev <= 0x33)) {
|
||||
/*
|
||||
* We need to to set REQ_DEPTH to 7 for U3 versions 1.0, 2.1,
|
||||
* We need to set REQ_DEPTH to 7 for U3 versions 1.0, 2.1,
|
||||
* 2.2 and 2.3, Darwin do so.
|
||||
*/
|
||||
if ((command >> AGPSTAT_RQ_DEPTH_SHIFT) > 7)
|
||||
|
||||
@@ -393,7 +393,7 @@ static int apm_open(struct inode * inode, struct file * filp)
|
||||
return as ? 0 : -ENOMEM;
|
||||
}
|
||||
|
||||
static struct file_operations apm_bios_fops = {
|
||||
static const struct file_operations apm_bios_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = apm_read,
|
||||
.poll = apm_poll,
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/miscdevice.h>
|
||||
|
||||
+130
-45
@@ -1,8 +1,7 @@
|
||||
/*
|
||||
* Blackfin On-Chip OTP Memory Interface
|
||||
* Supports BF52x/BF54x
|
||||
*
|
||||
* Copyright 2007-2008 Analog Devices Inc.
|
||||
* Copyright 2007-2009 Analog Devices Inc.
|
||||
*
|
||||
* Enter bugs at http://blackfin.uclinux.org/
|
||||
*
|
||||
@@ -17,8 +16,10 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/types.h>
|
||||
#include <mtd/mtd-abi.h>
|
||||
|
||||
#include <asm/blackfin.h>
|
||||
#include <asm/bfrom.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#define stamp(fmt, args...) pr_debug("%s:%i: " fmt "\n", __func__, __LINE__, ## args)
|
||||
@@ -30,39 +31,6 @@
|
||||
|
||||
static DEFINE_MUTEX(bfin_otp_lock);
|
||||
|
||||
/* OTP Boot ROM functions */
|
||||
#define _BOOTROM_OTP_COMMAND 0xEF000018
|
||||
#define _BOOTROM_OTP_READ 0xEF00001A
|
||||
#define _BOOTROM_OTP_WRITE 0xEF00001C
|
||||
|
||||
static u32 (* const otp_command)(u32 command, u32 value) = (void *)_BOOTROM_OTP_COMMAND;
|
||||
static u32 (* const otp_read)(u32 page, u32 flags, u64 *page_content) = (void *)_BOOTROM_OTP_READ;
|
||||
static u32 (* const otp_write)(u32 page, u32 flags, u64 *page_content) = (void *)_BOOTROM_OTP_WRITE;
|
||||
|
||||
/* otp_command(): defines for "command" */
|
||||
#define OTP_INIT 0x00000001
|
||||
#define OTP_CLOSE 0x00000002
|
||||
|
||||
/* otp_{read,write}(): defines for "flags" */
|
||||
#define OTP_LOWER_HALF 0x00000000 /* select upper/lower 64-bit half (bit 0) */
|
||||
#define OTP_UPPER_HALF 0x00000001
|
||||
#define OTP_NO_ECC 0x00000010 /* do not use ECC */
|
||||
#define OTP_LOCK 0x00000020 /* sets page protection bit for page */
|
||||
#define OTP_ACCESS_READ 0x00001000
|
||||
#define OTP_ACCESS_READWRITE 0x00002000
|
||||
|
||||
/* Return values for all functions */
|
||||
#define OTP_SUCCESS 0x00000000
|
||||
#define OTP_MASTER_ERROR 0x001
|
||||
#define OTP_WRITE_ERROR 0x003
|
||||
#define OTP_READ_ERROR 0x005
|
||||
#define OTP_ACC_VIO_ERROR 0x009
|
||||
#define OTP_DATA_MULT_ERROR 0x011
|
||||
#define OTP_ECC_MULT_ERROR 0x021
|
||||
#define OTP_PREV_WR_ERROR 0x041
|
||||
#define OTP_DATA_SB_WARN 0x100
|
||||
#define OTP_ECC_SB_WARN 0x200
|
||||
|
||||
/**
|
||||
* bfin_otp_read - Read OTP pages
|
||||
*
|
||||
@@ -86,9 +54,11 @@ static ssize_t bfin_otp_read(struct file *file, char __user *buff, size_t count,
|
||||
page = *pos / (sizeof(u64) * 2);
|
||||
while (bytes_done < count) {
|
||||
flags = (*pos % (sizeof(u64) * 2) ? OTP_UPPER_HALF : OTP_LOWER_HALF);
|
||||
stamp("processing page %i (%s)", page, (flags == OTP_UPPER_HALF ? "upper" : "lower"));
|
||||
ret = otp_read(page, flags, &content);
|
||||
stamp("processing page %i (0x%x:%s)", page, flags,
|
||||
(flags & OTP_UPPER_HALF ? "upper" : "lower"));
|
||||
ret = bfrom_OtpRead(page, flags, &content);
|
||||
if (ret & OTP_MASTER_ERROR) {
|
||||
stamp("error from otp: 0x%x", ret);
|
||||
bytes_done = -EIO;
|
||||
break;
|
||||
}
|
||||
@@ -96,7 +66,7 @@ static ssize_t bfin_otp_read(struct file *file, char __user *buff, size_t count,
|
||||
bytes_done = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if (flags == OTP_UPPER_HALF)
|
||||
if (flags & OTP_UPPER_HALF)
|
||||
++page;
|
||||
bytes_done += sizeof(content);
|
||||
*pos += sizeof(content);
|
||||
@@ -108,14 +78,53 @@ static ssize_t bfin_otp_read(struct file *file, char __user *buff, size_t count,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BFIN_OTP_WRITE_ENABLE
|
||||
static bool allow_writes;
|
||||
|
||||
/**
|
||||
* bfin_otp_write - Write OTP pages
|
||||
* bfin_otp_init_timing - setup OTP timing parameters
|
||||
*
|
||||
* Required before doing any write operation. Algorithms from HRM.
|
||||
*/
|
||||
static u32 bfin_otp_init_timing(void)
|
||||
{
|
||||
u32 tp1, tp2, tp3, timing;
|
||||
|
||||
tp1 = get_sclk() / 1000000;
|
||||
tp2 = (2 * get_sclk() / 10000000) << 8;
|
||||
tp3 = (0x1401) << 15;
|
||||
timing = tp1 | tp2 | tp3;
|
||||
if (bfrom_OtpCommand(OTP_INIT, timing))
|
||||
return 0;
|
||||
|
||||
return timing;
|
||||
}
|
||||
|
||||
/**
|
||||
* bfin_otp_deinit_timing - set timings to only allow reads
|
||||
*
|
||||
* Should be called after all writes are done.
|
||||
*/
|
||||
static void bfin_otp_deinit_timing(u32 timing)
|
||||
{
|
||||
/* mask bits [31:15] so that any attempts to write fail */
|
||||
bfrom_OtpCommand(OTP_CLOSE, 0);
|
||||
bfrom_OtpCommand(OTP_INIT, timing & ~(-1 << 15));
|
||||
bfrom_OtpCommand(OTP_CLOSE, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* bfin_otp_write - write OTP pages
|
||||
*
|
||||
* All writes must be in half page chunks (half page == 64 bits).
|
||||
*/
|
||||
static ssize_t bfin_otp_write(struct file *filp, const char __user *buff, size_t count, loff_t *pos)
|
||||
{
|
||||
stampit();
|
||||
ssize_t bytes_done;
|
||||
u32 timing, page, base_flags, flags, ret;
|
||||
u64 content;
|
||||
|
||||
if (!allow_writes)
|
||||
return -EACCES;
|
||||
|
||||
if (count % sizeof(u64))
|
||||
return -EMSGSIZE;
|
||||
@@ -123,20 +132,96 @@ static ssize_t bfin_otp_write(struct file *filp, const char __user *buff, size_t
|
||||
if (mutex_lock_interruptible(&bfin_otp_lock))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
/* need otp_init() documentation before this can be implemented */
|
||||
stampit();
|
||||
|
||||
timing = bfin_otp_init_timing();
|
||||
if (timing == 0) {
|
||||
mutex_unlock(&bfin_otp_lock);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
base_flags = OTP_CHECK_FOR_PREV_WRITE;
|
||||
|
||||
bytes_done = 0;
|
||||
page = *pos / (sizeof(u64) * 2);
|
||||
while (bytes_done < count) {
|
||||
flags = base_flags | (*pos % (sizeof(u64) * 2) ? OTP_UPPER_HALF : OTP_LOWER_HALF);
|
||||
stamp("processing page %i (0x%x:%s) from %p", page, flags,
|
||||
(flags & OTP_UPPER_HALF ? "upper" : "lower"), buff + bytes_done);
|
||||
if (copy_from_user(&content, buff + bytes_done, sizeof(content))) {
|
||||
bytes_done = -EFAULT;
|
||||
break;
|
||||
}
|
||||
ret = bfrom_OtpWrite(page, flags, &content);
|
||||
if (ret & OTP_MASTER_ERROR) {
|
||||
stamp("error from otp: 0x%x", ret);
|
||||
bytes_done = -EIO;
|
||||
break;
|
||||
}
|
||||
if (flags & OTP_UPPER_HALF)
|
||||
++page;
|
||||
bytes_done += sizeof(content);
|
||||
*pos += sizeof(content);
|
||||
}
|
||||
|
||||
bfin_otp_deinit_timing(timing);
|
||||
|
||||
mutex_unlock(&bfin_otp_lock);
|
||||
|
||||
return bytes_done;
|
||||
}
|
||||
|
||||
static long bfin_otp_ioctl(struct file *filp, unsigned cmd, unsigned long arg)
|
||||
{
|
||||
stampit();
|
||||
|
||||
switch (cmd) {
|
||||
case OTPLOCK: {
|
||||
u32 timing;
|
||||
int ret = -EIO;
|
||||
|
||||
if (!allow_writes)
|
||||
return -EACCES;
|
||||
|
||||
if (mutex_lock_interruptible(&bfin_otp_lock))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
timing = bfin_otp_init_timing();
|
||||
if (timing) {
|
||||
u32 otp_result = bfrom_OtpWrite(arg, OTP_LOCK, NULL);
|
||||
stamp("locking page %lu resulted in 0x%x", arg, otp_result);
|
||||
if (!(otp_result & OTP_MASTER_ERROR))
|
||||
ret = 0;
|
||||
|
||||
bfin_otp_deinit_timing(timing);
|
||||
}
|
||||
|
||||
mutex_unlock(&bfin_otp_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
case MEMLOCK:
|
||||
allow_writes = false;
|
||||
return 0;
|
||||
|
||||
case MEMUNLOCK:
|
||||
allow_writes = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
#else
|
||||
# define bfin_otp_write NULL
|
||||
# define bfin_otp_ioctl NULL
|
||||
#endif
|
||||
|
||||
static struct file_operations bfin_otp_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = bfin_otp_read,
|
||||
.write = bfin_otp_write,
|
||||
static const struct file_operations bfin_otp_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.unlocked_ioctl = bfin_otp_ioctl,
|
||||
.read = bfin_otp_read,
|
||||
.write = bfin_otp_write,
|
||||
};
|
||||
|
||||
static struct miscdevice bfin_otp_misc_device = {
|
||||
|
||||
+576
-1739
File diff suppressed because it is too large
Load Diff
@@ -56,6 +56,7 @@
|
||||
#include <linux/errno.h> /* for -EBUSY */
|
||||
#include <linux/ioport.h> /* for request_region */
|
||||
#include <linux/delay.h> /* for loops_per_jiffy */
|
||||
#include <linux/sched.h>
|
||||
#include <linux/smp_lock.h> /* cycle_kernel_lock() */
|
||||
#include <asm/io.h> /* for inb_p, outb_p, inb, outb, etc. */
|
||||
#include <asm/uaccess.h> /* for get_user, etc. */
|
||||
|
||||
+2
-1
@@ -30,6 +30,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ctype.h>
|
||||
@@ -2239,7 +2240,7 @@ static void do_softint(struct work_struct *work)
|
||||
struct channel *ch = container_of(work, struct channel, tqueue);
|
||||
/* Called in response to a modem change event */
|
||||
if (ch && ch->magic == EPCA_MAGIC) {
|
||||
struct tty_struct *tty = tty_port_tty_get(&ch->port);;
|
||||
struct tty_struct *tty = tty_port_tty_get(&ch->port);
|
||||
|
||||
if (tty && tty->driver_data) {
|
||||
if (test_and_clear_bit(EPCA_EVENT_HANGUP, &ch->event)) {
|
||||
|
||||
+3
-4
@@ -572,7 +572,7 @@ static void check_modem_status(struct esp_struct *info)
|
||||
info->icount.dcd++;
|
||||
if (status & UART_MSR_DCTS)
|
||||
info->icount.cts++;
|
||||
wake_up_interruptible(&info->delta_msr_wait);
|
||||
wake_up_interruptible(&info->port.delta_msr_wait);
|
||||
}
|
||||
|
||||
if ((info->port.flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
|
||||
@@ -927,7 +927,7 @@ static void shutdown(struct esp_struct *info)
|
||||
* clear delta_msr_wait queue to avoid mem leaks: we may free the irq
|
||||
* here so the queue might never be waken up
|
||||
*/
|
||||
wake_up_interruptible(&info->delta_msr_wait);
|
||||
wake_up_interruptible(&info->port.delta_msr_wait);
|
||||
wake_up_interruptible(&info->break_wait);
|
||||
|
||||
/* stop a DMA transfer on the port being closed */
|
||||
@@ -1800,7 +1800,7 @@ static int rs_ioctl(struct tty_struct *tty, struct file *file,
|
||||
spin_unlock_irqrestore(&info->lock, flags);
|
||||
while (1) {
|
||||
/* FIXME: convert to new style wakeup */
|
||||
interruptible_sleep_on(&info->delta_msr_wait);
|
||||
interruptible_sleep_on(&info->port.delta_msr_wait);
|
||||
/* see if a signal did it */
|
||||
if (signal_pending(current))
|
||||
return -ERESTARTSYS;
|
||||
@@ -2452,7 +2452,6 @@ static int __init espserial_init(void)
|
||||
info->config.flow_off = flow_off;
|
||||
info->config.pio_threshold = pio_threshold;
|
||||
info->next_port = ports;
|
||||
init_waitqueue_head(&info->delta_msr_wait);
|
||||
init_waitqueue_head(&info->break_wait);
|
||||
ports = info;
|
||||
printk(KERN_INFO "ttyP%d at 0x%04x (irq = %d) is an ESP ",
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/generic_serial.h>
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#define RTC_VERSION "1.07"
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/fcntl.h>
|
||||
|
||||
+12
-9
@@ -166,9 +166,8 @@ static irqreturn_t hpet_interrupt(int irq, void *data)
|
||||
unsigned long m, t;
|
||||
|
||||
t = devp->hd_ireqfreq;
|
||||
m = read_counter(&devp->hd_hpet->hpet_mc);
|
||||
write_counter(t + m + devp->hd_hpets->hp_delta,
|
||||
&devp->hd_timer->hpet_compare);
|
||||
m = read_counter(&devp->hd_timer->hpet_compare);
|
||||
write_counter(t + m, &devp->hd_timer->hpet_compare);
|
||||
}
|
||||
|
||||
if (devp->hd_flags & HPET_SHARED_IRQ)
|
||||
@@ -504,21 +503,25 @@ static int hpet_ioctl_ieon(struct hpet_dev *devp)
|
||||
g = v | Tn_32MODE_CNF_MASK | Tn_INT_ENB_CNF_MASK;
|
||||
|
||||
if (devp->hd_flags & HPET_PERIODIC) {
|
||||
write_counter(t, &timer->hpet_compare);
|
||||
g |= Tn_TYPE_CNF_MASK;
|
||||
v |= Tn_TYPE_CNF_MASK;
|
||||
writeq(v, &timer->hpet_config);
|
||||
v |= Tn_VAL_SET_CNF_MASK;
|
||||
v |= Tn_TYPE_CNF_MASK | Tn_VAL_SET_CNF_MASK;
|
||||
writeq(v, &timer->hpet_config);
|
||||
local_irq_save(flags);
|
||||
|
||||
/* NOTE: what we modify here is a hidden accumulator
|
||||
/*
|
||||
* NOTE: First we modify the hidden accumulator
|
||||
* register supported by periodic-capable comparators.
|
||||
* We never want to modify the (single) counter; that
|
||||
* would affect all the comparators.
|
||||
* would affect all the comparators. The value written
|
||||
* is the counter value when the first interrupt is due.
|
||||
*/
|
||||
m = read_counter(&hpet->hpet_mc);
|
||||
write_counter(t + m + hpetp->hp_delta, &timer->hpet_compare);
|
||||
/*
|
||||
* Then we modify the comparator, indicating the period
|
||||
* for subsequent interrupt.
|
||||
*/
|
||||
write_counter(t, &timer->hpet_compare);
|
||||
} else {
|
||||
local_irq_save(flags);
|
||||
m = read_counter(&hpet->hpet_mc);
|
||||
|
||||
@@ -678,7 +678,7 @@ int hvc_poll(struct hvc_struct *hp)
|
||||
EXPORT_SYMBOL_GPL(hvc_poll);
|
||||
|
||||
/**
|
||||
* hvc_resize() - Update terminal window size information.
|
||||
* __hvc_resize() - Update terminal window size information.
|
||||
* @hp: HVC console pointer
|
||||
* @ws: Terminal window size structure
|
||||
*
|
||||
@@ -687,12 +687,12 @@ EXPORT_SYMBOL_GPL(hvc_poll);
|
||||
*
|
||||
* Locking: Locking free; the function MUST be called holding hp->lock
|
||||
*/
|
||||
void hvc_resize(struct hvc_struct *hp, struct winsize ws)
|
||||
void __hvc_resize(struct hvc_struct *hp, struct winsize ws)
|
||||
{
|
||||
hp->ws = ws;
|
||||
schedule_work(&hp->tty_resize);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hvc_resize);
|
||||
EXPORT_SYMBOL_GPL(__hvc_resize);
|
||||
|
||||
/*
|
||||
* This kthread is either polling or interrupt driven. This is determined by
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user