Commit 9a95b9e7 authored by Russell King's avatar Russell King

Merge branch 'sa11x0-mcp-fixes' into fixes

parents 4e7682d0 0af5e4c3
VERSION = 3 VERSION = 3
PATCHLEVEL = 2 PATCHLEVEL = 3
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = EXTRAVERSION = -rc1
NAME = Saber-toothed Squirrel NAME = Saber-toothed Squirrel
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -202,7 +202,6 @@ static struct irda_platform_data assabet_irda_data = { ...@@ -202,7 +202,6 @@ static struct irda_platform_data assabet_irda_data = {
static struct mcp_plat_data assabet_mcp_data = { static struct mcp_plat_data assabet_mcp_data = {
.mccr0 = MCCR0_ADM, .mccr0 = MCCR0_ADM,
.sclk_rate = 11981000, .sclk_rate = 11981000,
.codec = "ucb1x00",
}; };
static void __init assabet_init(void) static void __init assabet_init(void)
...@@ -253,17 +252,6 @@ static void __init assabet_init(void) ...@@ -253,17 +252,6 @@ static void __init assabet_init(void)
sa11x0_register_mtd(&assabet_flash_data, assabet_flash_resources, sa11x0_register_mtd(&assabet_flash_data, assabet_flash_resources,
ARRAY_SIZE(assabet_flash_resources)); ARRAY_SIZE(assabet_flash_resources));
sa11x0_register_irda(&assabet_irda_data); sa11x0_register_irda(&assabet_irda_data);
/*
* Setup the PPC unit correctly.
*/
PPDR &= ~PPC_RXD4;
PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
PSDR |= PPC_RXD4;
PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
ASSABET_BCR_set(ASSABET_BCR_CODEC_RST);
sa11x0_register_mcp(&assabet_mcp_data); sa11x0_register_mcp(&assabet_mcp_data);
} }
......
...@@ -124,23 +124,12 @@ static void __init cerf_map_io(void) ...@@ -124,23 +124,12 @@ static void __init cerf_map_io(void)
static struct mcp_plat_data cerf_mcp_data = { static struct mcp_plat_data cerf_mcp_data = {
.mccr0 = MCCR0_ADM, .mccr0 = MCCR0_ADM,
.sclk_rate = 11981000, .sclk_rate = 11981000,
.codec = "ucb1x00",
}; };
static void __init cerf_init(void) static void __init cerf_init(void)
{ {
platform_add_devices(cerf_devices, ARRAY_SIZE(cerf_devices)); platform_add_devices(cerf_devices, ARRAY_SIZE(cerf_devices));
sa11x0_register_mtd(&cerf_flash_data, &cerf_flash_resource, 1); sa11x0_register_mtd(&cerf_flash_data, &cerf_flash_resource, 1);
/*
* Setup the PPC unit correctly.
*/
PPDR &= ~PPC_RXD4;
PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
PSDR |= PPC_RXD4;
PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
sa11x0_register_mcp(&cerf_mcp_data); sa11x0_register_mcp(&cerf_mcp_data);
} }
......
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/pda_power.h> #include <linux/pda_power.h>
#include <linux/mfd/ucb1x00.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
...@@ -86,15 +85,10 @@ static struct scoop_pcmcia_config collie_pcmcia_config = { ...@@ -86,15 +85,10 @@ static struct scoop_pcmcia_config collie_pcmcia_config = {
.num_devs = 1, .num_devs = 1,
}; };
static struct ucb1x00_plat_data collie_ucb1x00_data = {
.gpio_base = COLLIE_TC35143_GPIO_BASE,
};
static struct mcp_plat_data collie_mcp_data = { static struct mcp_plat_data collie_mcp_data = {
.mccr0 = MCCR0_ADM | MCCR0_ExtClk, .mccr0 = MCCR0_ADM | MCCR0_ExtClk,
.sclk_rate = 9216000, .sclk_rate = 9216000,
.codec = "ucb1x00", .gpio_base = COLLIE_TC35143_GPIO_BASE,
.codec_pdata = &collie_ucb1x00_data,
}; };
/* /*
...@@ -356,16 +350,6 @@ static void __init collie_init(void) ...@@ -356,16 +350,6 @@ static void __init collie_init(void)
sa11x0_register_mtd(&collie_flash_data, collie_flash_resources, sa11x0_register_mtd(&collie_flash_data, collie_flash_resources,
ARRAY_SIZE(collie_flash_resources)); ARRAY_SIZE(collie_flash_resources));
/*
* Setup the PPC unit correctly.
*/
PPDR &= ~PPC_RXD4;
PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
PSDR |= PPC_RXD4;
PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
sa11x0_register_mcp(&collie_mcp_data); sa11x0_register_mcp(&collie_mcp_data);
sharpsl_save_param(); sharpsl_save_param();
......
...@@ -217,15 +217,10 @@ static struct platform_device sa11x0uart3_device = { ...@@ -217,15 +217,10 @@ static struct platform_device sa11x0uart3_device = {
static struct resource sa11x0mcp_resources[] = { static struct resource sa11x0mcp_resources[] = {
[0] = { [0] = {
.start = __PREG(Ser4MCCR0), .start = __PREG(Ser4MCCR0),
.end = __PREG(Ser4MCCR0) + 0x1C - 1, .end = __PREG(Ser4MCCR0) + 0xffff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
.start = __PREG(Ser4MCCR1),
.end = __PREG(Ser4MCCR1) + 0x4 - 1,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_Ser4MCP, .start = IRQ_Ser4MCP,
.end = IRQ_Ser4MCP, .end = IRQ_Ser4MCP,
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
......
...@@ -17,8 +17,6 @@ struct mcp_plat_data { ...@@ -17,8 +17,6 @@ struct mcp_plat_data {
u32 mccr1; u32 mccr1;
unsigned int sclk_rate; unsigned int sclk_rate;
int gpio_base; int gpio_base;
const char *codec;
void *codec_pdata;
}; };
#endif #endif
...@@ -24,20 +24,10 @@ ...@@ -24,20 +24,10 @@
static struct mcp_plat_data lart_mcp_data = { static struct mcp_plat_data lart_mcp_data = {
.mccr0 = MCCR0_ADM, .mccr0 = MCCR0_ADM,
.sclk_rate = 11981000, .sclk_rate = 11981000,
.codec = "ucb1x00",
}; };
static void __init lart_init(void) static void __init lart_init(void)
{ {
/*
* Setup the PPC unit correctly.
*/
PPDR &= ~PPC_RXD4;
PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
PSDR |= PPC_RXD4;
PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
sa11x0_register_mcp(&lart_mcp_data); sa11x0_register_mcp(&lart_mcp_data);
} }
......
...@@ -55,22 +55,11 @@ static struct resource shannon_flash_resource = { ...@@ -55,22 +55,11 @@ static struct resource shannon_flash_resource = {
static struct mcp_plat_data shannon_mcp_data = { static struct mcp_plat_data shannon_mcp_data = {
.mccr0 = MCCR0_ADM, .mccr0 = MCCR0_ADM,
.sclk_rate = 11981000, .sclk_rate = 11981000,
.codec = "ucb1x00",
}; };
static void __init shannon_init(void) static void __init shannon_init(void)
{ {
sa11x0_register_mtd(&shannon_flash_data, &shannon_flash_resource, 1); sa11x0_register_mtd(&shannon_flash_data, &shannon_flash_resource, 1);
/*
* Setup the PPC unit correctly.
*/
PPDR &= ~PPC_RXD4;
PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
PSDR |= PPC_RXD4;
PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
sa11x0_register_mcp(&shannon_mcp_data); sa11x0_register_mcp(&shannon_mcp_data);
} }
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/mfd/ucb1x00.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <mach/hardware.h> #include <mach/hardware.h>
...@@ -188,15 +187,10 @@ static struct resource simpad_flash_resources [] = { ...@@ -188,15 +187,10 @@ static struct resource simpad_flash_resources [] = {
} }
}; };
static struct ucb1x00_plat_data simpad_ucb1x00_data = {
.gpio_base = SIMPAD_UCB1X00_GPIO_BASE,
};
static struct mcp_plat_data simpad_mcp_data = { static struct mcp_plat_data simpad_mcp_data = {
.mccr0 = MCCR0_ADM, .mccr0 = MCCR0_ADM,
.sclk_rate = 11981000, .sclk_rate = 11981000,
.codec = "ucb1300", .gpio_base = SIMPAD_UCB1X00_GPIO_BASE,
.codec_pdata = &simpad_ucb1x00_data,
}; };
...@@ -384,16 +378,6 @@ static int __init simpad_init(void) ...@@ -384,16 +378,6 @@ static int __init simpad_init(void)
sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources, sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources,
ARRAY_SIZE(simpad_flash_resources)); ARRAY_SIZE(simpad_flash_resources));
/*
* Setup the PPC unit correctly.
*/
PPDR &= ~PPC_RXD4;
PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
PSDR |= PPC_RXD4;
PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
sa11x0_register_mcp(&simpad_mcp_data); sa11x0_register_mcp(&simpad_mcp_data);
ret = platform_add_devices(devices, ARRAY_SIZE(devices)); ret = platform_add_devices(devices, ARRAY_SIZE(devices));
......
boot/compressed/vmlinux boot/compressed/vmlinux
tools/test_get_len tools/test_get_len
tools/insn_sanity
...@@ -125,16 +125,6 @@ config HAVE_LATENCYTOP_SUPPORT ...@@ -125,16 +125,6 @@ config HAVE_LATENCYTOP_SUPPORT
config MMU config MMU
def_bool y def_bool y
config ZONE_DMA
bool "DMA memory allocation support" if EXPERT
default y
help
DMA memory allocation support allows devices with less than 32-bit
addressing to allocate within the first 16MB of address space.
Disable if no such devices will be used.
If unsure, say Y.
config SBUS config SBUS
bool bool
...@@ -255,6 +245,16 @@ source "kernel/Kconfig.freezer" ...@@ -255,6 +245,16 @@ source "kernel/Kconfig.freezer"
menu "Processor type and features" menu "Processor type and features"
config ZONE_DMA
bool "DMA memory allocation support" if EXPERT
default y
help
DMA memory allocation support allows devices with less than 32-bit
addressing to allocate within the first 16MB of address space.
Disable if no such devices will be used.
If unsure, say Y.
source "kernel/time/Kconfig" source "kernel/time/Kconfig"
config SMP config SMP
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
# include <asm/unistd_32.h> # include <asm/unistd_32.h>
# define __ARCH_WANT_IPC_PARSE_VERSION # define __ARCH_WANT_IPC_PARSE_VERSION
# define __ARCH_WANT_STAT64 # define __ARCH_WANT_STAT64
# define __ARCH_WANT_SYS_IPC
# define __ARCH_WANT_SYS_OLD_MMAP # define __ARCH_WANT_SYS_OLD_MMAP
# define __ARCH_WANT_SYS_OLD_SELECT # define __ARCH_WANT_SYS_OLD_SELECT
......
...@@ -65,7 +65,7 @@ ...@@ -65,7 +65,7 @@
* UV2: Bit 19 selects between * UV2: Bit 19 selects between
* (0): 10 microsecond timebase and * (0): 10 microsecond timebase and
* (1): 80 microseconds * (1): 80 microseconds
* we're using 655us, similar to UV1: 65 units of 10us * we're using 560us, similar to UV1: 65 units of 10us
*/ */
#define UV1_INTD_SOFT_ACK_TIMEOUT_PERIOD (9UL) #define UV1_INTD_SOFT_ACK_TIMEOUT_PERIOD (9UL)
#define UV2_INTD_SOFT_ACK_TIMEOUT_PERIOD (15UL) #define UV2_INTD_SOFT_ACK_TIMEOUT_PERIOD (15UL)
...@@ -167,6 +167,7 @@ ...@@ -167,6 +167,7 @@
#define FLUSH_RETRY_TIMEOUT 2 #define FLUSH_RETRY_TIMEOUT 2
#define FLUSH_GIVEUP 3 #define FLUSH_GIVEUP 3
#define FLUSH_COMPLETE 4 #define FLUSH_COMPLETE 4
#define FLUSH_RETRY_BUSYBUG 5
/* /*
* tuning the action when the numalink network is extremely delayed * tuning the action when the numalink network is extremely delayed
...@@ -235,10 +236,10 @@ struct bau_msg_payload { ...@@ -235,10 +236,10 @@ struct bau_msg_payload {
/* /*
* Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) * UV1 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor)
* see table 4.2.3.0.1 in broacast_assist spec. * see table 4.2.3.0.1 in broacast_assist spec.
*/ */
struct bau_msg_header { struct uv1_bau_msg_header {
unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */ unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */
/* bits 5:0 */ /* bits 5:0 */
unsigned int base_dest_nasid:15; /* nasid of the first bit */ unsigned int base_dest_nasid:15; /* nasid of the first bit */
...@@ -317,6 +318,70 @@ struct bau_msg_header { ...@@ -317,6 +318,70 @@ struct bau_msg_header {
/* bits 127:107 */ /* bits 127:107 */
}; };
/*
* UV2 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor)
* see figure 9-2 of harp_sys.pdf
*/
struct uv2_bau_msg_header {
unsigned int base_dest_nasid:15; /* nasid of the first bit */
/* bits 14:0 */ /* in uvhub map */
unsigned int dest_subnodeid:5; /* must be 0x10, for the LB */
/* bits 19:15 */
unsigned int rsvd_1:1; /* must be zero */
/* bit 20 */
/* Address bits 59:21 */
/* bits 25:2 of address (44:21) are payload */
/* these next 24 bits become bytes 12-14 of msg */
/* bits 28:21 land in byte 12 */
unsigned int replied_to:1; /* sent as 0 by the source to
byte 12 */
/* bit 21 */
unsigned int msg_type:3; /* software type of the
message */
/* bits 24:22 */
unsigned int canceled:1; /* message canceled, resource
is to be freed*/
/* bit 25 */
unsigned int payload_1:3; /* not currently used */
/* bits 28:26 */
/* bits 36:29 land in byte 13 */
unsigned int payload_2a:3; /* not currently used */
unsigned int payload_2b:5; /* not currently used */
/* bits 36:29 */
/* bits 44:37 land in byte 14 */
unsigned int payload_3:8; /* not currently used */
/* bits 44:37 */
unsigned int rsvd_2:7; /* reserved */
/* bits 51:45 */
unsigned int swack_flag:1; /* software acknowledge flag */
/* bit 52 */
unsigned int rsvd_3a:3; /* must be zero */
unsigned int rsvd_3b:8; /* must be zero */
unsigned int rsvd_3c:8; /* must be zero */
unsigned int rsvd_3d:3; /* must be zero */
/* bits 74:53 */
unsigned int fairness:3; /* usually zero */
/* bits 77:75 */
unsigned int sequence:16; /* message sequence number */
/* bits 93:78 Suppl_A */
unsigned int chaining:1; /* next descriptor is part of
this activation*/
/* bit 94 */
unsigned int multilevel:1; /* multi-level multicast
format */
/* bit 95 */
unsigned int rsvd_4:24; /* ordered / source node /
source subnode / aging
must be zero */
/* bits 119:96 */
unsigned int command:8; /* message type */
/* bits 127:120 */
};
/* /*
* The activation descriptor: * The activation descriptor:
* The format of the message to send, plus all accompanying control * The format of the message to send, plus all accompanying control
...@@ -327,10 +392,14 @@ struct bau_desc { ...@@ -327,10 +392,14 @@ struct bau_desc {
/* /*
* message template, consisting of header and payload: * message template, consisting of header and payload:
*/ */
struct bau_msg_header header; union bau_msg_header {
struct uv1_bau_msg_header uv1_hdr;
struct uv2_bau_msg_header uv2_hdr;
} header;
struct bau_msg_payload payload; struct bau_msg_payload payload;
}; };
/* /* UV1:
* -payload-- ---------header------ * -payload-- ---------header------
* bytes 0-11 bits 41-56 bits 58-81 * bytes 0-11 bits 41-56 bits 58-81
* A B (2) C (3) * A B (2) C (3)
...@@ -340,6 +409,16 @@ struct bau_desc { ...@@ -340,6 +409,16 @@ struct bau_desc {
* bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector) * bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector)
* ------------payload queue----------- * ------------payload queue-----------
*/ */
/* UV2:
* -payload-- ---------header------
* bytes 0-11 bits 70-78 bits 21-44
* A B (2) C (3)
*
* A/B/C are moved to:
* A C B
* bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector)
* ------------payload queue-----------
*/
/* /*
* The payload queue on the destination side is an array of these. * The payload queue on the destination side is an array of these.
...@@ -385,7 +464,6 @@ struct bau_pq_entry { ...@@ -385,7 +464,6 @@ struct bau_pq_entry {
struct msg_desc { struct msg_desc {
struct bau_pq_entry *msg; struct bau_pq_entry *msg;
int msg_slot; int msg_slot;
int swack_slot;
struct bau_pq_entry *queue_first; struct bau_pq_entry *queue_first;
struct bau_pq_entry *queue_last; struct bau_pq_entry *queue_last;
}; };
...@@ -405,6 +483,7 @@ struct ptc_stats { ...@@ -405,6 +483,7 @@ struct ptc_stats {
requests */ requests */
unsigned long s_stimeout; /* source side timeouts */ unsigned long s_stimeout; /* source side timeouts */
unsigned long s_dtimeout; /* destination side timeouts */ unsigned long s_dtimeout; /* destination side timeouts */
unsigned long s_strongnacks; /* number of strong nack's */
unsigned long s_time; /* time spent in sending side */ unsigned long s_time; /* time spent in sending side */
unsigned long s_retriesok; /* successful retries */ unsigned long s_retriesok; /* successful retries */
unsigned long s_ntargcpu; /* total number of cpu's unsigned long s_ntargcpu; /* total number of cpu's
...@@ -439,6 +518,9 @@ struct ptc_stats { ...@@ -439,6 +518,9 @@ struct ptc_stats {
unsigned long s_retry_messages; /* retry broadcasts */ unsigned long s_retry_messages; /* retry broadcasts */
unsigned long s_bau_reenabled; /* for bau enable/disable */ unsigned long s_bau_reenabled; /* for bau enable/disable */
unsigned long s_bau_disabled; /* for bau enable/disable */ unsigned long s_bau_disabled; /* for bau enable/disable */
unsigned long s_uv2_wars; /* uv2 workaround, perm. busy */
unsigned long s_uv2_wars_hw; /* uv2 workaround, hiwater */
unsigned long s_uv2_war_waits; /* uv2 workaround, long waits */
/* destination statistics */ /* destination statistics */
unsigned long d_alltlb; /* times all tlb's on this unsigned long d_alltlb; /* times all tlb's on this
cpu were flushed */ cpu were flushed */
...@@ -511,9 +593,12 @@ struct bau_control { ...@@ -511,9 +593,12 @@ struct bau_control {
short osnode; short osnode;
short uvhub_cpu; short uvhub_cpu;
short uvhub; short uvhub;
short uvhub_version;
short cpus_in_socket; short cpus_in_socket;
short cpus_in_uvhub; short cpus_in_uvhub;
short partition_base_pnode; short partition_base_pnode;
short using_desc; /* an index, like uvhub_cpu */
unsigned int inuse_map;
unsigned short message_number; unsigned short message_number;
unsigned short uvhub_quiesce; unsigned short uvhub_quiesce;
short socket_acknowledge_count[DEST_Q_SIZE]; short socket_acknowledge_count[DEST_Q_SIZE];
...@@ -531,6 +616,7 @@ struct bau_control { ...@@ -531,6 +616,7 @@ struct bau_control {
int cong_response_us; int cong_response_us;
int cong_reps; int cong_reps;
int cong_period; int cong_period;
unsigned long clocks_per_100_usec;
cycles_t period_time; cycles_t period_time;
long period_requests; long period_requests;
struct hub_and_pnode *thp; struct hub_and_pnode *thp;
...@@ -591,6 +677,11 @@ static inline void write_mmr_sw_ack(unsigned long mr) ...@@ -591,6 +677,11 @@ static inline void write_mmr_sw_ack(unsigned long mr)
uv_write_local_mmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, mr); uv_write_local_mmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, mr);
} }
static inline void write_gmmr_sw_ack(int pnode, unsigned long mr)
{
write_gmmr(pnode, UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, mr);
}
static inline unsigned long read_mmr_sw_ack(void) static inline unsigned long read_mmr_sw_ack(void)
{ {
return read_lmmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE); return read_lmmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE);
......
...@@ -290,14 +290,15 @@ static inline int pit_verify_msb(unsigned char val) ...@@ -290,14 +290,15 @@ static inline int pit_verify_msb(unsigned char val)
static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap) static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap)
{ {
int count; int count;
u64 tsc = 0; u64 tsc = 0, prev_tsc = 0;
for (count = 0; count < 50000; count++) { for (count = 0; count < 50000; count++) {
if (!pit_verify_msb(val)) if (!pit_verify_msb(val))
break; break;
prev_tsc = tsc;
tsc = get_cycles(); tsc = get_cycles();
} }
*deltap = get_cycles() - tsc; *deltap = get_cycles() - prev_tsc;
*tscp = tsc; *tscp = tsc;
/* /*
...@@ -311,9 +312,9 @@ static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *de ...@@ -311,9 +312,9 @@ static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *de
* How many MSB values do we want to see? We aim for * How many MSB values do we want to see? We aim for
* a maximum error rate of 500ppm (in practice the * a maximum error rate of 500ppm (in practice the
* real error is much smaller), but refuse to spend * real error is much smaller), but refuse to spend
* more than 25ms on it. * more than 50ms on it.
*/ */
#define MAX_QUICK_PIT_MS 25 #define MAX_QUICK_PIT_MS 50
#define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256) #define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
static unsigned long quick_pit_calibrate(void) static unsigned long quick_pit_calibrate(void)
...@@ -383,15 +384,12 @@ static unsigned long quick_pit_calibrate(void) ...@@ -383,15 +384,12 @@ static unsigned long quick_pit_calibrate(void)
* *
* As a result, we can depend on there not being * As a result, we can depend on there not being
* any odd delays anywhere, and the TSC reads are * any odd delays anywhere, and the TSC reads are
* reliable (within the error). We also adjust the * reliable (within the error).
* delta to the middle of the error bars, just
* because it looks nicer.
* *
* kHz = ticks / time-in-seconds / 1000; * kHz = ticks / time-in-seconds / 1000;
* kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000 * kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000
* kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000) * kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000)
*/ */
delta += (long)(d2 - d1)/2;
delta *= PIT_TICK_RATE; delta *= PIT_TICK_RATE;
do_div(delta, i*256*1000); do_div(delta, i*256*1000);
printk("Fast TSC calibration using PIT\n"); printk("Fast TSC calibration using PIT\n");
......
...@@ -219,7 +219,9 @@ ab: STOS/W/D/Q Yv,rAX ...@@ -219,7 +219,9 @@ ab: STOS/W/D/Q Yv,rAX
ac: LODS/B AL,Xb ac: LODS/B AL,Xb
ad: LODS/W/D/Q rAX,Xv ad: LODS/W/D/Q rAX,Xv
ae: SCAS/B AL,Yb ae: SCAS/B AL,Yb
af: SCAS/W/D/Q rAX,Xv # Note: The May 2011 Intel manual shows Xv for the second parameter of the
# next instruction but Yv is correct
af: SCAS/W/D/Q rAX,Yv
# 0xb0 - 0xbf # 0xb0 - 0xbf
b0: MOV AL/R8L,Ib b0: MOV AL/R8L,Ib
b1: MOV CL/R9L,Ib b1: MOV CL/R9L,Ib
...@@ -729,8 +731,8 @@ de: VAESDEC Vdq,Hdq,Wdq (66),(v1) ...@@ -729,8 +731,8 @@ de: VAESDEC Vdq,Hdq,Wdq (66),(v1)
df: VAESDECLAST Vdq,Hdq,Wdq (66),(v1) df: VAESDECLAST Vdq,Hdq,Wdq (66),(v1)
f0: MOVBE Gy,My | MOVBE Gw,Mw (66) | CRC32 Gd,Eb (F2) f0: MOVBE Gy,My | MOVBE Gw,Mw (66) | CRC32 Gd,Eb (F2)
f1: MOVBE My,Gy | MOVBE Mw,Gw (66) | CRC32 Gd,Ey (F2) f1: MOVBE My,Gy | MOVBE Mw,Gw (66) | CRC32 Gd,Ey (F2)
f3: ANDN Gy,By,Ey (v) f2: ANDN Gy,By,Ey (v)
f4: Grp17 (1A) f3: Grp17 (1A)
f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v) f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v)
f6: MULX By,Gy,rDX,Ey (F2),(v) f6: MULX By,Gy,rDX,Ey (F2),(v)
f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v) f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v)
......
This diff is collapsed.
...@@ -87,6 +87,7 @@ config GPIO_GENERIC_PLATFORM ...@@ -87,6 +87,7 @@ config GPIO_GENERIC_PLATFORM
config GPIO_IT8761E config GPIO_IT8761E
tristate "IT8761E GPIO support" tristate "IT8761E GPIO support"
depends on X86 # unconditional access to IO space.
help help
Say yes here to support GPIO functionality of IT8761E super I/O chip. Say yes here to support GPIO functionality of IT8761E super I/O chip.
......
...@@ -248,7 +248,7 @@ static void ioh_gpio_setup(struct ioh_gpio *chip, int num_port) ...@@ -248,7 +248,7 @@ static void ioh_gpio_setup(struct ioh_gpio *chip, int num_port)
static int ioh_irq_type(struct irq_data *d, unsigned int type) static int ioh_irq_type(struct irq_data *d, unsigned int type)
{ {
u32 im; u32 im;
u32 *im_reg; void __iomem *im_reg;
u32 ien; u32 ien;
u32 im_pos; u32 im_pos;
int ch; int ch;
...@@ -412,7 +412,7 @@ static int __devinit ioh_gpio_probe(struct pci_dev *pdev, ...@@ -412,7 +412,7 @@ static int __devinit ioh_gpio_probe(struct pci_dev *pdev,
int i, j; int i, j;
struct ioh_gpio *chip; struct ioh_gpio *chip;
void __iomem *base; void __iomem *base;
void __iomem *chip_save; void *chip_save;
int irq_base; int irq_base;
ret = pci_enable_device(pdev); ret = pci_enable_device(pdev);
...@@ -428,7 +428,7 @@ static int __devinit ioh_gpio_probe(struct pci_dev *pdev, ...@@ -428,7 +428,7 @@ static int __devinit ioh_gpio_probe(struct pci_dev *pdev,
} }
base = pci_iomap(pdev, 1, 0); base = pci_iomap(pdev, 1, 0);
if (base == 0) { if (!base) {
dev_err(&pdev->dev, "%s : pci_iomap failed", __func__); dev_err(&pdev->dev, "%s : pci_iomap failed", __func__);
ret = -ENOMEM; ret = -ENOMEM;
goto err_iomap; goto err_iomap;
...@@ -521,7 +521,7 @@ static void __devexit ioh_gpio_remove(struct pci_dev *pdev) ...@@ -521,7 +521,7 @@ static void __devexit ioh_gpio_remove(struct pci_dev *pdev)
int err; int err;
int i; int i;
struct ioh_gpio *chip = pci_get_drvdata(pdev); struct ioh_gpio *chip = pci_get_drvdata(pdev);
void __iomem *chip_save; void *chip_save;
chip_save = chip; chip_save = chip;
......
...@@ -231,7 +231,7 @@ static void pch_gpio_setup(struct pch_gpio *chip) ...@@ -231,7 +231,7 @@ static void pch_gpio_setup(struct pch_gpio *chip)
static int pch_irq_type(struct irq_data *d, unsigned int type) static int pch_irq_type(struct irq_data *d, unsigned int type)
{ {
u32 im; u32 im;
u32 *im_reg; u32 __iomem *im_reg;
u32 ien; u32 ien;
u32 im_pos; u32 im_pos;
int ch; int ch;
...@@ -376,7 +376,7 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev, ...@@ -376,7 +376,7 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev,
} }
chip->base = pci_iomap(pdev, 1, 0); chip->base = pci_iomap(pdev, 1, 0);
if (chip->base == 0) { if (!chip->base) {
dev_err(&pdev->dev, "%s : pci_iomap FAILED", __func__); dev_err(&pdev->dev, "%s : pci_iomap FAILED", __func__);
ret = -ENOMEM; ret = -ENOMEM;
goto err_iomap; goto err_iomap;
......
...@@ -52,7 +52,7 @@ static int tps65910_gpio_output(struct gpio_chip *gc, unsigned offset, ...@@ -52,7 +52,7 @@ static int tps65910_gpio_output(struct gpio_chip *gc, unsigned offset,
struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio); struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);
/* Set the initial value */ /* Set the initial value */
tps65910_gpio_set(gc, 0, value); tps65910_gpio_set(gc, offset, value);
return tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset, return tps65910_set_bits(tps65910, TPS65910_GPIO0 + offset,
GPIO_CFG_MASK); GPIO_CFG_MASK);
......
...@@ -26,35 +26,9 @@ ...@@ -26,35 +26,9 @@
#define to_mcp(d) container_of(d, struct mcp, attached_device) #define to_mcp(d) container_of(d, struct mcp, attached_device)
#define to_mcp_driver(d) container_of(d, struct mcp_driver, drv) #define to_mcp_driver(d) container_of(d, struct mcp_driver, drv)
static const struct mcp_device_id *mcp_match_id(const struct mcp_device_id *id,
const char *codec)
{
while (id->name[0]) {
if (strcmp(codec, id->name) == 0)
return id;
id++;
}
return NULL;
}
const struct mcp_device_id *mcp_get_device_id(const struct mcp *mcp)
{
const struct mcp_driver *driver =
to_mcp_driver(mcp->attached_device.driver);
return mcp_match_id(driver->id_table, mcp->codec);
}
EXPORT_SYMBOL(mcp_get_device_id);
static int mcp_bus_match(struct device *dev, struct device_driver *drv) static int mcp_bus_match(struct device *dev, struct device_driver *drv)
{ {
const struct mcp *mcp = to_mcp(dev); return 1;
const struct mcp_driver *driver = to_mcp_driver(drv);
if (driver->id_table)
return !!mcp_match_id(driver->id_table, mcp->codec);
return 0;
} }
static int mcp_bus_probe(struct device *dev) static int mcp_bus_probe(struct device *dev)
...@@ -100,18 +74,9 @@ static int mcp_bus_resume(struct device *dev) ...@@ -100,18 +74,9 @@ static int mcp_bus_resume(struct device *dev)
return ret; return ret;
} }
static int mcp_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
{
struct mcp *mcp = to_mcp(dev);
add_uevent_var(env, "MODALIAS=%s%s", MCP_MODULE_PREFIX, mcp->codec);
return 0;
}
static struct bus_type mcp_bus_type = { static struct bus_type mcp_bus_type = {
.name = "mcp", .name = "mcp",
.match = mcp_bus_match, .match = mcp_bus_match,
.uevent = mcp_bus_uevent,
.probe = mcp_bus_probe, .probe = mcp_bus_probe,
.remove = mcp_bus_remove, .remove = mcp_bus_remove,
.suspend = mcp_bus_suspend, .suspend = mcp_bus_suspend,
...@@ -128,9 +93,11 @@ static struct bus_type mcp_bus_type = { ...@@ -128,9 +93,11 @@ static struct bus_type mcp_bus_type = {
*/ */
void mcp_set_telecom_divisor(struct mcp *mcp, unsigned int div) void mcp_set_telecom_divisor(struct mcp *mcp, unsigned int div)
{ {
spin_lock_irq(&mcp->lock); unsigned long flags;
spin_lock_irqsave(&mcp->lock, flags);
mcp->ops->set_telecom_divisor(mcp, div); mcp->ops->set_telecom_divisor(mcp, div);
spin_unlock_irq(&mcp->lock); spin_unlock_irqrestore(&mcp->lock, flags);
} }
EXPORT_SYMBOL(mcp_set_telecom_divisor); EXPORT_SYMBOL(mcp_set_telecom_divisor);
...@@ -143,9 +110,11 @@ EXPORT_SYMBOL(mcp_set_telecom_divisor); ...@@ -143,9 +110,11 @@ EXPORT_SYMBOL(mcp_set_telecom_divisor);
*/ */
void mcp_set_audio_divisor(struct mcp *mcp, unsigned int div) void mcp_set_audio_divisor(struct mcp *mcp, unsigned int div)
{ {
spin_lock_irq(&mcp->lock); unsigned long flags;
spin_lock_irqsave(&mcp->lock, flags);
mcp->ops->set_audio_divisor(mcp, div); mcp->ops->set_audio_divisor(mcp, div);
spin_unlock_irq(&mcp->lock); spin_unlock_irqrestore(&mcp->lock, flags);
} }
EXPORT_SYMBOL(mcp_set_audio_divisor); EXPORT_SYMBOL(mcp_set_audio_divisor);
...@@ -198,10 +167,11 @@ EXPORT_SYMBOL(mcp_reg_read); ...@@ -198,10 +167,11 @@ EXPORT_SYMBOL(mcp_reg_read);
*/ */
void mcp_enable(struct mcp *mcp) void mcp_enable(struct mcp *mcp)
{ {
spin_lock_irq(&mcp->lock); unsigned long flags;
spin_lock_irqsave(&mcp->lock, flags);
if (mcp->use_count++ == 0) if (mcp->use_count++ == 0)
mcp->ops->enable(mcp); mcp->ops->enable(mcp);
spin_unlock_irq(&mcp->lock); spin_unlock_irqrestore(&mcp->lock, flags);
} }
EXPORT_SYMBOL(mcp_enable); EXPORT_SYMBOL(mcp_enable);
...@@ -247,14 +217,9 @@ struct mcp *mcp_host_alloc(struct device *parent, size_t size) ...@@ -247,14 +217,9 @@ struct mcp *mcp_host_alloc(struct device *parent, size_t size)
} }
EXPORT_SYMBOL(mcp_host_alloc); EXPORT_SYMBOL(mcp_host_alloc);
int mcp_host_register(struct mcp *mcp, void *pdata) int mcp_host_register(struct mcp *mcp)
{ {
if (!mcp->codec)
return -EINVAL;
mcp->attached_device.platform_data = pdata;
dev_set_name(&mcp->attached_device, "mcp0"); dev_set_name(&mcp->attached_device, "mcp0");
request_module("%s%s", MCP_MODULE_PREFIX, mcp->codec);
return device_register(&mcp->attached_device); return device_register(&mcp->attached_device);
} }
EXPORT_SYMBOL(mcp_host_register); EXPORT_SYMBOL(mcp_host_register);
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/mfd/mcp.h> #include <linux/mfd/mcp.h>
#include <linux/io.h>
#include <mach/dma.h> #include <mach/dma.h>
#include <mach/hardware.h> #include <mach/hardware.h>
...@@ -27,19 +26,12 @@ ...@@ -27,19 +26,12 @@
#include <asm/system.h> #include <asm/system.h>
#include <mach/mcp.h> #include <mach/mcp.h>
/* Register offsets */ #include <mach/assabet.h>
#define MCCR0 0x00
#define MCDR0 0x08
#define MCDR1 0x0C
#define MCDR2 0x10
#define MCSR 0x18
#define MCCR1 0x00
struct mcp_sa11x0 { struct mcp_sa11x0 {
u32 mccr0; u32 mccr0;
u32 mccr1; u32 mccr1;
unsigned char *mccr0_base;
unsigned char *mccr1_base;
}; };
#define priv(mcp) ((struct mcp_sa11x0 *)mcp_priv(mcp)) #define priv(mcp) ((struct mcp_sa11x0 *)mcp_priv(mcp))
...@@ -47,25 +39,25 @@ struct mcp_sa11x0 { ...@@ -47,25 +39,25 @@ struct mcp_sa11x0 {
static void static void
mcp_sa11x0_set_telecom_divisor(struct mcp *mcp, unsigned int divisor) mcp_sa11x0_set_telecom_divisor(struct mcp *mcp, unsigned int divisor)
{ {
struct mcp_sa11x0 *priv = priv(mcp); unsigned int mccr0;
divisor /= 32; divisor /= 32;
priv->mccr0 &= ~0x00007f00; mccr0 = Ser4MCCR0 & ~0x00007f00;
priv->mccr0 |= divisor << 8; mccr0 |= divisor << 8;
__raw_writel(priv->mccr0, priv->mccr0_base + MCCR0); Ser4MCCR0 = mccr0;
} }
static void static void
mcp_sa11x0_set_audio_divisor(struct mcp *mcp, unsigned int divisor) mcp_sa11x0_set_audio_divisor(struct mcp *mcp, unsigned int divisor)
{ {
struct mcp_sa11x0 *priv = priv(mcp); unsigned int mccr0;
divisor /= 32; divisor /= 32;
priv->mccr0 &= ~0x0000007f; mccr0 = Ser4MCCR0 & ~0x0000007f;
priv->mccr0 |= divisor; mccr0 |= divisor;
__raw_writel(priv->mccr0, priv->mccr0_base + MCCR0); Ser4MCCR0 = mccr0;
} }
/* /*
...@@ -79,16 +71,12 @@ mcp_sa11x0_write(struct mcp *mcp, unsigned int reg, unsigned int val) ...@@ -79,16 +71,12 @@ mcp_sa11x0_write(struct mcp *mcp, unsigned int reg, unsigned int val)
{ {
int ret = -ETIME; int ret = -ETIME;
int i; int i;
u32 mcpreg;
struct mcp_sa11x0 *priv = priv(mcp);
mcpreg = reg << 17 | MCDR2_Wr | (val & 0xffff); Ser4MCDR2 = reg << 17 | MCDR2_Wr | (val & 0xffff);
__raw_writel(mcpreg, priv->mccr0_base + MCDR2);
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
udelay(mcp->rw_timeout); udelay(mcp->rw_timeout);
mcpreg = __raw_readl(priv->mccr0_base + MCSR); if (Ser4MCSR & MCSR_CWC) {
if (mcpreg & MCSR_CWC) {
ret = 0; ret = 0;
break; break;
} }
...@@ -109,18 +97,13 @@ mcp_sa11x0_read(struct mcp *mcp, unsigned int reg) ...@@ -109,18 +97,13 @@ mcp_sa11x0_read(struct mcp *mcp, unsigned int reg)
{ {
int ret = -ETIME; int ret = -ETIME;
int i; int i;
u32 mcpreg;
struct mcp_sa11x0 *priv = priv(mcp);
mcpreg = reg << 17 | MCDR2_Rd; Ser4MCDR2 = reg << 17 | MCDR2_Rd;
__raw_writel(mcpreg, priv->mccr0_base + MCDR2);
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
udelay(mcp->rw_timeout); udelay(mcp->rw_timeout);
mcpreg = __raw_readl(priv->mccr0_base + MCSR); if (Ser4MCSR & MCSR_CRC) {
if (mcpreg & MCSR_CRC) { ret = Ser4MCDR2 & 0xffff;
ret = __raw_readl(priv->mccr0_base + MCDR2)
& 0xffff;
break; break;
} }
} }
...@@ -133,19 +116,13 @@ mcp_sa11x0_read(struct mcp *mcp, unsigned int reg) ...@@ -133,19 +116,13 @@ mcp_sa11x0_read(struct mcp *mcp, unsigned int reg)
static void mcp_sa11x0_enable(struct mcp *mcp) static void mcp_sa11x0_enable(struct mcp *mcp)
{ {
struct mcp_sa11x0 *priv = priv(mcp); Ser4MCSR = -1;
Ser4MCCR0 |= MCCR0_MCE;
__raw_writel(-1, priv->mccr0_base + MCSR);
priv->mccr0 |= MCCR0_MCE;
__raw_writel(priv->mccr0, priv->mccr0_base + MCCR0);
} }
static void mcp_sa11x0_disable(struct mcp *mcp) static void mcp_sa11x0_disable(struct mcp *mcp)
{ {
struct mcp_sa11x0 *priv = priv(mcp); Ser4MCCR0 &= ~MCCR0_MCE;
priv->mccr0 &= ~MCCR0_MCE;
__raw_writel(priv->mccr0, priv->mccr0_base + MCCR0);
} }
/* /*
...@@ -165,69 +142,50 @@ static int mcp_sa11x0_probe(struct platform_device *pdev) ...@@ -165,69 +142,50 @@ static int mcp_sa11x0_probe(struct platform_device *pdev)
struct mcp_plat_data *data = pdev->dev.platform_data; struct mcp_plat_data *data = pdev->dev.platform_data;
struct mcp *mcp; struct mcp *mcp;
int ret; int ret;
struct mcp_sa11x0 *priv;
struct resource *res_mem0, *res_mem1;
u32 size0, size1;
if (!data) if (!data)
return -ENODEV; return -ENODEV;
if (!data->codec) if (!request_mem_region(0x80060000, 0x60, "sa11x0-mcp"))
return -ENODEV;
res_mem0 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res_mem0)
return -ENODEV;
size0 = res_mem0->end - res_mem0->start + 1;
res_mem1 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
if (!res_mem1)
return -ENODEV;
size1 = res_mem1->end - res_mem1->start + 1;
if (!request_mem_region(res_mem0->start, size0, "sa11x0-mcp"))
return -EBUSY; return -EBUSY;
if (!request_mem_region(res_mem1->start, size1, "sa11x0-mcp")) {
ret = -EBUSY;
goto release;
}
mcp = mcp_host_alloc(&pdev->dev, sizeof(struct mcp_sa11x0)); mcp = mcp_host_alloc(&pdev->dev, sizeof(struct mcp_sa11x0));
if (!mcp) { if (!mcp) {
ret = -ENOMEM; ret = -ENOMEM;
goto release2; goto release;
} }
priv = priv(mcp);
mcp->owner = THIS_MODULE; mcp->owner = THIS_MODULE;
mcp->ops = &mcp_sa11x0; mcp->ops = &mcp_sa11x0;
mcp->sclk_rate = data->sclk_rate; mcp->sclk_rate = data->sclk_rate;
mcp->dma_audio_rd = DDAR_DevAdd(res_mem0->start + MCDR0) mcp->dma_audio_rd = DMA_Ser4MCP0Rd;
+ DDAR_DevRd + DDAR_Brst4 + DDAR_8BitDev; mcp->dma_audio_wr = DMA_Ser4MCP0Wr;
mcp->dma_audio_wr = DDAR_DevAdd(res_mem0->start + MCDR0) mcp->dma_telco_rd = DMA_Ser4MCP1Rd;
+ DDAR_DevWr + DDAR_Brst4 + DDAR_8BitDev; mcp->dma_telco_wr = DMA_Ser4MCP1Wr;
mcp->dma_telco_rd = DDAR_DevAdd(res_mem0->start + MCDR1) mcp->gpio_base = data->gpio_base;
+ DDAR_DevRd + DDAR_Brst4 + DDAR_8BitDev;
mcp->dma_telco_wr = DDAR_DevAdd(res_mem0->start + MCDR1)
+ DDAR_DevWr + DDAR_Brst4 + DDAR_8BitDev;
mcp->codec = data->codec;
platform_set_drvdata(pdev, mcp); platform_set_drvdata(pdev, mcp);
if (machine_is_assabet()) {
ASSABET_BCR_set(ASSABET_BCR_CODEC_RST);
}
/*
* Setup the PPC unit correctly.
*/
PPDR &= ~PPC_RXD4;
PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
PSDR |= PPC_RXD4;
PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
/* /*
* Initialise device. Note that we initially * Initialise device. Note that we initially
* set the sampling rate to minimum. * set the sampling rate to minimum.
*/ */
priv->mccr0_base = ioremap(res_mem0->start, size0); Ser4MCSR = -1;
priv->mccr1_base = ioremap(res_mem1->start, size1); Ser4MCCR1 = data->mccr1;
Ser4MCCR0 = data->mccr0 | 0x7f7f;
__raw_writel(-1, priv->mccr0_base + MCSR);
priv->mccr1 = data->mccr1;
priv->mccr0 = data->mccr0 | 0x7f7f;
__raw_writel(priv->mccr0, priv->mccr0_base + MCCR0);
__raw_writel(priv->mccr1, priv->mccr1_base + MCCR1);
/* /*
* Calculate the read/write timeout (us) from the bit clock * Calculate the read/write timeout (us) from the bit clock
...@@ -237,53 +195,36 @@ static int mcp_sa11x0_probe(struct platform_device *pdev) ...@@ -237,53 +195,36 @@ static int mcp_sa11x0_probe(struct platform_device *pdev)
mcp->rw_timeout = (64 * 3 * 1000000 + mcp->sclk_rate - 1) / mcp->rw_timeout = (64 * 3 * 1000000 + mcp->sclk_rate - 1) /
mcp->sclk_rate; mcp->sclk_rate;
ret = mcp_host_register(mcp, data->codec_pdata); ret = mcp_host_register(mcp);
if (ret == 0) if (ret == 0)
goto out; goto out;
release2:
release_mem_region(res_mem1->start, size1);
release: release:
release_mem_region(res_mem0->start, size0); release_mem_region(0x80060000, 0x60);
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
out: out:
return ret; return ret;
} }
static int mcp_sa11x0_remove(struct platform_device *pdev) static int mcp_sa11x0_remove(struct platform_device *dev)
{ {
struct mcp *mcp = platform_get_drvdata(pdev); struct mcp *mcp = platform_get_drvdata(dev);
struct mcp_sa11x0 *priv = priv(mcp);
struct resource *res_mem;
u32 size;
platform_set_drvdata(pdev, NULL); platform_set_drvdata(dev, NULL);
mcp_host_unregister(mcp); mcp_host_unregister(mcp);
release_mem_region(0x80060000, 0x60);
res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (res_mem) {
size = res_mem->end - res_mem->start + 1;
release_mem_region(res_mem->start, size);
}
res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
if (res_mem) {
size = res_mem->end - res_mem->start + 1;
release_mem_region(res_mem->start, size);
}
iounmap(priv->mccr0_base);
iounmap(priv->mccr1_base);
return 0; return 0;
} }
static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state) static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state)
{ {
struct mcp *mcp = platform_get_drvdata(dev); struct mcp *mcp = platform_get_drvdata(dev);
struct mcp_sa11x0 *priv = priv(mcp);
u32 mccr0;
mccr0 = priv->mccr0 & ~MCCR0_MCE; priv(mcp)->mccr0 = Ser4MCCR0;
__raw_writel(mccr0, priv->mccr0_base + MCCR0); priv(mcp)->mccr1 = Ser4MCCR1;
Ser4MCCR0 &= ~MCCR0_MCE;
return 0; return 0;
} }
...@@ -291,10 +232,9 @@ static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state) ...@@ -291,10 +232,9 @@ static int mcp_sa11x0_suspend(struct platform_device *dev, pm_message_t state)
static int mcp_sa11x0_resume(struct platform_device *dev) static int mcp_sa11x0_resume(struct platform_device *dev)
{ {
struct mcp *mcp = platform_get_drvdata(dev); struct mcp *mcp = platform_get_drvdata(dev);
struct mcp_sa11x0 *priv = priv(mcp);
__raw_writel(priv->mccr0, priv->mccr0_base + MCCR0); Ser4MCCR1 = priv(mcp)->mccr1;
__raw_writel(priv->mccr1, priv->mccr1_base + MCCR1); Ser4MCCR0 = priv(mcp)->mccr0;
return 0; return 0;
} }
...@@ -311,7 +251,6 @@ static struct platform_driver mcp_sa11x0_driver = { ...@@ -311,7 +251,6 @@ static struct platform_driver mcp_sa11x0_driver = {
.resume = mcp_sa11x0_resume, .resume = mcp_sa11x0_resume,
.driver = { .driver = {
.name = "sa11x0-mcp", .name = "sa11x0-mcp",
.owner = THIS_MODULE,
}, },
}; };
......
...@@ -36,15 +36,6 @@ static DEFINE_MUTEX(ucb1x00_mutex); ...@@ -36,15 +36,6 @@ static DEFINE_MUTEX(ucb1x00_mutex);
static LIST_HEAD(ucb1x00_drivers); static LIST_HEAD(ucb1x00_drivers);
static LIST_HEAD(ucb1x00_devices); static LIST_HEAD(ucb1x00_devices);
static struct mcp_device_id ucb1x00_id[] = {
{ "ucb1x00", 0 }, /* auto-detection */
{ "ucb1200", UCB_ID_1200 },
{ "ucb1300", UCB_ID_1300 },
{ "tc35143", UCB_ID_TC35143 },
{ }
};
MODULE_DEVICE_TABLE(mcp, ucb1x00_id);
/** /**
* ucb1x00_io_set_dir - set IO direction * ucb1x00_io_set_dir - set IO direction
* @ucb: UCB1x00 structure describing chip * @ucb: UCB1x00 structure describing chip
...@@ -157,16 +148,22 @@ static int ucb1x00_gpio_direction_output(struct gpio_chip *chip, unsigned offset ...@@ -157,16 +148,22 @@ static int ucb1x00_gpio_direction_output(struct gpio_chip *chip, unsigned offset
{ {
struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio); struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio);
unsigned long flags; unsigned long flags;
unsigned old, mask = 1 << offset;
spin_lock_irqsave(&ucb->io_lock, flags); spin_lock_irqsave(&ucb->io_lock, flags);
ucb->io_dir |= (1 << offset); old = ucb->io_out;
ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir);
if (value) if (value)
ucb->io_out |= 1 << offset; ucb->io_out |= mask;
else else
ucb->io_out &= ~(1 << offset); ucb->io_out &= ~mask;
if (old != ucb->io_out)
ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out); ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out);
if (!(ucb->io_dir & mask)) {
ucb->io_dir |= mask;
ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir);
}
spin_unlock_irqrestore(&ucb->io_lock, flags); spin_unlock_irqrestore(&ucb->io_lock, flags);
return 0; return 0;
...@@ -536,33 +533,17 @@ static struct class ucb1x00_class = { ...@@ -536,33 +533,17 @@ static struct class ucb1x00_class = {
static int ucb1x00_probe(struct mcp *mcp) static int ucb1x00_probe(struct mcp *mcp)
{ {
const struct mcp_device_id *mid;
struct ucb1x00 *ucb; struct ucb1x00 *ucb;
struct ucb1x00_driver *drv; struct ucb1x00_driver *drv;
struct ucb1x00_plat_data *pdata;
unsigned int id; unsigned int id;
int ret = -ENODEV; int ret = -ENODEV;
int temp; int temp;
mcp_enable(mcp); mcp_enable(mcp);
id = mcp_reg_read(mcp, UCB_ID); id = mcp_reg_read(mcp, UCB_ID);
mid = mcp_get_device_id(mcp);
if (mid && mid->driver_data) { if (id != UCB_ID_1200 && id != UCB_ID_1300 && id != UCB_ID_TC35143) {
if (id != mid->driver_data) { printk(KERN_WARNING "UCB1x00 ID not found: %04x\n", id);
printk(KERN_WARNING "%s wrong ID %04x found: %04x\n",
mid->name, (unsigned int) mid->driver_data, id);
goto err_disable;
}
} else {
mid = &ucb1x00_id[1];
while (mid->driver_data) {
if (id == mid->driver_data)
break;
mid++;
}
printk(KERN_WARNING "%s ID not found: %04x\n",
ucb1x00_id[0].name, id);
goto err_disable; goto err_disable;
} }
...@@ -571,28 +552,28 @@ static int ucb1x00_probe(struct mcp *mcp) ...@@ -571,28 +552,28 @@ static int ucb1x00_probe(struct mcp *mcp)
if (!ucb) if (!ucb)
goto err_disable; goto err_disable;
pdata = mcp->attached_device.platform_data;
ucb->dev.class = &ucb1x00_class; ucb->dev.class = &ucb1x00_class;
ucb->dev.parent = &mcp->attached_device; ucb->dev.parent = &mcp->attached_device;
dev_set_name(&ucb->dev, mid->name); dev_set_name(&ucb->dev, "ucb1x00");
spin_lock_init(&ucb->lock); spin_lock_init(&ucb->lock);
spin_lock_init(&ucb->io_lock); spin_lock_init(&ucb->io_lock);
sema_init(&ucb->adc_sem, 1); sema_init(&ucb->adc_sem, 1);
ucb->id = mid; ucb->id = id;
ucb->mcp = mcp; ucb->mcp = mcp;
ucb->irq = ucb1x00_detect_irq(ucb); ucb->irq = ucb1x00_detect_irq(ucb);
if (ucb->irq == NO_IRQ) { if (ucb->irq == NO_IRQ) {
printk(KERN_ERR "%s: IRQ probe failed\n", mid->name); printk(KERN_ERR "UCB1x00: IRQ probe failed\n");
ret = -ENODEV; ret = -ENODEV;
goto err_free; goto err_free;
} }
ucb->gpio.base = -1; ucb->gpio.base = -1;
if (pdata && (pdata->gpio_base >= 0)) { if (mcp->gpio_base != 0) {
ucb->gpio.label = dev_name(&ucb->dev); ucb->gpio.label = dev_name(&ucb->dev);
ucb->gpio.base = pdata->gpio_base; ucb->gpio.base = mcp->gpio_base;
ucb->gpio.ngpio = 10; ucb->gpio.ngpio = 10;
ucb->gpio.set = ucb1x00_gpio_set; ucb->gpio.set = ucb1x00_gpio_set;
ucb->gpio.get = ucb1x00_gpio_get; ucb->gpio.get = ucb1x00_gpio_get;
...@@ -605,10 +586,10 @@ static int ucb1x00_probe(struct mcp *mcp) ...@@ -605,10 +586,10 @@ static int ucb1x00_probe(struct mcp *mcp)
dev_info(&ucb->dev, "gpio_base not set so no gpiolib support"); dev_info(&ucb->dev, "gpio_base not set so no gpiolib support");
ret = request_irq(ucb->irq, ucb1x00_irq, IRQF_TRIGGER_RISING, ret = request_irq(ucb->irq, ucb1x00_irq, IRQF_TRIGGER_RISING,
mid->name, ucb); "UCB1x00", ucb);
if (ret) { if (ret) {
printk(KERN_ERR "%s: unable to grab irq%d: %d\n", printk(KERN_ERR "ucb1x00: unable to grab irq%d: %d\n",
mid->name, ucb->irq, ret); ucb->irq, ret);
goto err_gpio; goto err_gpio;
} }
...@@ -712,6 +693,7 @@ static int ucb1x00_resume(struct mcp *mcp) ...@@ -712,6 +693,7 @@ static int ucb1x00_resume(struct mcp *mcp)
struct ucb1x00 *ucb = mcp_get_drvdata(mcp); struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
struct ucb1x00_dev *dev; struct ucb1x00_dev *dev;
ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out);
ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir); ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir);
mutex_lock(&ucb1x00_mutex); mutex_lock(&ucb1x00_mutex);
list_for_each_entry(dev, &ucb->devs, dev_node) { list_for_each_entry(dev, &ucb->devs, dev_node) {
...@@ -730,7 +712,6 @@ static struct mcp_driver ucb1x00_driver = { ...@@ -730,7 +712,6 @@ static struct mcp_driver ucb1x00_driver = {
.remove = ucb1x00_remove, .remove = ucb1x00_remove,
.suspend = ucb1x00_suspend, .suspend = ucb1x00_suspend,
.resume = ucb1x00_resume, .resume = ucb1x00_resume,
.id_table = ucb1x00_id,
}; };
static int __init ucb1x00_init(void) static int __init ucb1x00_init(void)
......
...@@ -47,7 +47,6 @@ struct ucb1x00_ts { ...@@ -47,7 +47,6 @@ struct ucb1x00_ts {
u16 x_res; u16 x_res;
u16 y_res; u16 y_res;
unsigned int restart:1;
unsigned int adcsync:1; unsigned int adcsync:1;
}; };
...@@ -207,15 +206,17 @@ static int ucb1x00_thread(void *_ts) ...@@ -207,15 +206,17 @@ static int ucb1x00_thread(void *_ts)
{ {
struct ucb1x00_ts *ts = _ts; struct ucb1x00_ts *ts = _ts;
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
bool frozen, ignore = false;
int valid = 0; int valid = 0;
set_freezable(); set_freezable();
add_wait_queue(&ts->irq_wait, &wait); add_wait_queue(&ts->irq_wait, &wait);
while (!kthread_should_stop()) { while (!kthread_freezable_should_stop(&frozen)) {
unsigned int x, y, p; unsigned int x, y, p;
signed long timeout; signed long timeout;
ts->restart = 0; if (frozen)
ignore = true;
ucb1x00_adc_enable(ts->ucb); ucb1x00_adc_enable(ts->ucb);
...@@ -258,7 +259,7 @@ static int ucb1x00_thread(void *_ts) ...@@ -258,7 +259,7 @@ static int ucb1x00_thread(void *_ts)
* space. We therefore leave it to user space * space. We therefore leave it to user space
* to do any filtering they please. * to do any filtering they please.
*/ */
if (!ts->restart) { if (!ignore) {
ucb1x00_ts_evt_add(ts, p, x, y); ucb1x00_ts_evt_add(ts, p, x, y);
valid = 1; valid = 1;
} }
...@@ -267,8 +268,6 @@ static int ucb1x00_thread(void *_ts) ...@@ -267,8 +268,6 @@ static int ucb1x00_thread(void *_ts)
timeout = HZ / 100; timeout = HZ / 100;
} }
try_to_freeze();
schedule_timeout(timeout); schedule_timeout(timeout);
} }
...@@ -340,26 +339,6 @@ static void ucb1x00_ts_close(struct input_dev *idev) ...@@ -340,26 +339,6 @@ static void ucb1x00_ts_close(struct input_dev *idev)
ucb1x00_disable(ts->ucb); ucb1x00_disable(ts->ucb);
} }
#ifdef CONFIG_PM
static int ucb1x00_ts_resume(struct ucb1x00_dev *dev)
{
struct ucb1x00_ts *ts = dev->priv;
if (ts->rtask != NULL) {
/*
* Restart the TS thread to ensure the
* TS interrupt mode is set up again
* after sleep.
*/
ts->restart = 1;
wake_up(&ts->irq_wait);
}
return 0;
}
#else
#define ucb1x00_ts_resume NULL
#endif
/* /*
* Initialisation. * Initialisation.
...@@ -382,7 +361,7 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev) ...@@ -382,7 +361,7 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev)
ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC;
idev->name = "Touchscreen panel"; idev->name = "Touchscreen panel";
idev->id.product = ts->ucb->id->driver_data; idev->id.product = ts->ucb->id;
idev->open = ucb1x00_ts_open; idev->open = ucb1x00_ts_open;
idev->close = ucb1x00_ts_close; idev->close = ucb1x00_ts_close;
...@@ -425,7 +404,6 @@ static void ucb1x00_ts_remove(struct ucb1x00_dev *dev) ...@@ -425,7 +404,6 @@ static void ucb1x00_ts_remove(struct ucb1x00_dev *dev)
static struct ucb1x00_driver ucb1x00_ts_driver = { static struct ucb1x00_driver ucb1x00_ts_driver = {
.add = ucb1x00_ts_add, .add = ucb1x00_ts_add,
.remove = ucb1x00_ts_remove, .remove = ucb1x00_ts_remove,
.resume = ucb1x00_ts_resume,
}; };
static int __init ucb1x00_ts_init(void) static int __init ucb1x00_ts_init(void)
......
...@@ -322,9 +322,6 @@ EXPORT_SYMBOL(clear_nlink); ...@@ -322,9 +322,6 @@ EXPORT_SYMBOL(clear_nlink);
void set_nlink(struct inode *inode, unsigned int nlink) void set_nlink(struct inode *inode, unsigned int nlink)
{ {
if (!nlink) { if (!nlink) {
printk_ratelimited(KERN_INFO
"set_nlink() clearing i_nlink on %s inode %li\n",
inode->i_sb->s_type->name, inode->i_ino);
clear_nlink(inode); clear_nlink(inode);
} else { } else {
/* Yes, some filesystems do change nlink from zero to one */ /* Yes, some filesystems do change nlink from zero to one */
......
...@@ -77,6 +77,8 @@ static int show_stat(struct seq_file *p, void *v) ...@@ -77,6 +77,8 @@ static int show_stat(struct seq_file *p, void *v)
steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL];
guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST];
guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE];
sum += kstat_cpu_irqs_sum(i);
sum += arch_irq_stat_cpu(i);
for (j = 0; j < NR_SOFTIRQS; j++) { for (j = 0; j < NR_SOFTIRQS; j++) {
unsigned int softirq_stat = kstat_softirqs_cpu(j, i); unsigned int softirq_stat = kstat_softirqs_cpu(j, i);
......
...@@ -179,47 +179,33 @@ static const char *qnx4_checkroot(struct super_block *sb) ...@@ -179,47 +179,33 @@ static const char *qnx4_checkroot(struct super_block *sb)
struct qnx4_inode_entry *rootdir; struct qnx4_inode_entry *rootdir;
int rd, rl; int rd, rl;
int i, j; int i, j;
int found = 0;
if (*(qnx4_sb(sb)->sb->RootDir.di_fname) != '/') { if (*(qnx4_sb(sb)->sb->RootDir.di_fname) != '/')
return "no qnx4 filesystem (no root dir)."; return "no qnx4 filesystem (no root dir).";
} else {
QNX4DEBUG((KERN_NOTICE "QNX4 filesystem found on dev %s.\n", sb->s_id)); QNX4DEBUG((KERN_NOTICE "QNX4 filesystem found on dev %s.\n", sb->s_id));
rd = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_blk) - 1; rd = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_blk) - 1;
rl = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_size); rl = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_size);
for (j = 0; j < rl; j++) { for (j = 0; j < rl; j++) {
bh = sb_bread(sb, rd + j); /* root dir, first block */ bh = sb_bread(sb, rd + j); /* root dir, first block */
if (bh == NULL) { if (bh == NULL)
return "unable to read root entry."; return "unable to read root entry.";
} rootdir = (struct qnx4_inode_entry *) bh->b_data;
for (i = 0; i < QNX4_INODES_PER_BLOCK; i++) { for (i = 0; i < QNX4_INODES_PER_BLOCK; i++, rootdir++) {
rootdir = (struct qnx4_inode_entry *) (bh->b_data + i * QNX4_DIR_ENTRY_SIZE);
if (rootdir->di_fname != NULL) {
QNX4DEBUG((KERN_INFO "rootdir entry found : [%s]\n", rootdir->di_fname)); QNX4DEBUG((KERN_INFO "rootdir entry found : [%s]\n", rootdir->di_fname));
if (!strcmp(rootdir->di_fname, if (strcmp(rootdir->di_fname, QNX4_BMNAME) != 0)
QNX4_BMNAME)) { continue;
found = 1;
qnx4_sb(sb)->BitMap = kmemdup(rootdir, qnx4_sb(sb)->BitMap = kmemdup(rootdir,
sizeof(struct qnx4_inode_entry), sizeof(struct qnx4_inode_entry),
GFP_KERNEL); GFP_KERNEL);
if (!qnx4_sb(sb)->BitMap) { brelse(bh);
brelse (bh); if (!qnx4_sb(sb)->BitMap)
return "not enough memory for bitmap inode"; return "not enough memory for bitmap inode";
}/* keep bitmap inode known */ /* keep bitmap inode known */
break; return NULL;
}
}
} }
brelse(bh); brelse(bh);
if (found != 0) {
break;
}
} }
if (found == 0) {
return "bitmap file not found."; return "bitmap file not found.";
}
}
return NULL;
} }
static int qnx4_fill_super(struct super_block *s, void *data, int silent) static int qnx4_fill_super(struct super_block *s, void *data, int silent)
...@@ -270,7 +256,7 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent) ...@@ -270,7 +256,7 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent)
if (IS_ERR(root)) { if (IS_ERR(root)) {
printk(KERN_ERR "qnx4: get inode failed\n"); printk(KERN_ERR "qnx4: get inode failed\n");
ret = PTR_ERR(root); ret = PTR_ERR(root);
goto out; goto outb;
} }
ret = -ENOMEM; ret = -ENOMEM;
...@@ -283,6 +269,8 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent) ...@@ -283,6 +269,8 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent)
outi: outi:
iput(root); iput(root);
outb:
kfree(qs->BitMap);
out: out:
brelse(bh); brelse(bh);
outnobh: outnobh:
......
...@@ -1186,6 +1186,8 @@ int freeze_super(struct super_block *sb) ...@@ -1186,6 +1186,8 @@ int freeze_super(struct super_block *sb)
printk(KERN_ERR printk(KERN_ERR
"VFS:Filesystem freeze failed\n"); "VFS:Filesystem freeze failed\n");
sb->s_frozen = SB_UNFROZEN; sb->s_frozen = SB_UNFROZEN;
smp_wmb();
wake_up(&sb->s_wait_unfrozen);
deactivate_locked_super(sb); deactivate_locked_super(sb);
return ret; return ret;
} }
......
...@@ -271,7 +271,7 @@ extern int keyring_add_key(struct key *keyring, ...@@ -271,7 +271,7 @@ extern int keyring_add_key(struct key *keyring,
extern struct key *key_lookup(key_serial_t id); extern struct key *key_lookup(key_serial_t id);
static inline key_serial_t key_serial(struct key *key) static inline key_serial_t key_serial(const struct key *key)
{ {
return key ? key->serial : 0; return key ? key->serial : 0;
} }
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#ifndef MCP_H #ifndef MCP_H
#define MCP_H #define MCP_H
#include <linux/mod_devicetable.h>
#include <mach/dma.h> #include <mach/dma.h>
struct mcp_ops; struct mcp_ops;
...@@ -27,7 +26,7 @@ struct mcp { ...@@ -27,7 +26,7 @@ struct mcp {
dma_device_t dma_telco_rd; dma_device_t dma_telco_rd;
dma_device_t dma_telco_wr; dma_device_t dma_telco_wr;
struct device attached_device; struct device attached_device;
const char *codec; int gpio_base;
}; };
struct mcp_ops { struct mcp_ops {
...@@ -45,11 +44,10 @@ void mcp_reg_write(struct mcp *, unsigned int, unsigned int); ...@@ -45,11 +44,10 @@ void mcp_reg_write(struct mcp *, unsigned int, unsigned int);
unsigned int mcp_reg_read(struct mcp *, unsigned int); unsigned int mcp_reg_read(struct mcp *, unsigned int);
void mcp_enable(struct mcp *); void mcp_enable(struct mcp *);
void mcp_disable(struct mcp *); void mcp_disable(struct mcp *);
const struct mcp_device_id *mcp_get_device_id(const struct mcp *mcp);
#define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate) #define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate)
struct mcp *mcp_host_alloc(struct device *, size_t); struct mcp *mcp_host_alloc(struct device *, size_t);
int mcp_host_register(struct mcp *, void *); int mcp_host_register(struct mcp *);
void mcp_host_unregister(struct mcp *); void mcp_host_unregister(struct mcp *);
struct mcp_driver { struct mcp_driver {
...@@ -58,7 +56,6 @@ struct mcp_driver { ...@@ -58,7 +56,6 @@ struct mcp_driver {
void (*remove)(struct mcp *); void (*remove)(struct mcp *);
int (*suspend)(struct mcp *, pm_message_t); int (*suspend)(struct mcp *, pm_message_t);
int (*resume)(struct mcp *); int (*resume)(struct mcp *);
const struct mcp_device_id *id_table;
}; };
int mcp_driver_register(struct mcp_driver *); int mcp_driver_register(struct mcp_driver *);
...@@ -67,6 +64,9 @@ void mcp_driver_unregister(struct mcp_driver *); ...@@ -67,6 +64,9 @@ void mcp_driver_unregister(struct mcp_driver *);
#define mcp_get_drvdata(mcp) dev_get_drvdata(&(mcp)->attached_device) #define mcp_get_drvdata(mcp) dev_get_drvdata(&(mcp)->attached_device)
#define mcp_set_drvdata(mcp,d) dev_set_drvdata(&(mcp)->attached_device, d) #define mcp_set_drvdata(mcp,d) dev_set_drvdata(&(mcp)->attached_device, d)
#define mcp_priv(mcp) ((void *)((mcp)+1)) static inline void *mcp_priv(struct mcp *mcp)
{
return mcp + 1;
}
#endif #endif
...@@ -104,9 +104,6 @@ ...@@ -104,9 +104,6 @@
#define UCB_MODE_DYN_VFLAG_ENA (1 << 12) #define UCB_MODE_DYN_VFLAG_ENA (1 << 12)
#define UCB_MODE_AUD_OFF_CAN (1 << 13) #define UCB_MODE_AUD_OFF_CAN (1 << 13)
struct ucb1x00_plat_data {
int gpio_base;
};
struct ucb1x00_irq { struct ucb1x00_irq {
void *devid; void *devid;
...@@ -119,7 +116,7 @@ struct ucb1x00 { ...@@ -119,7 +116,7 @@ struct ucb1x00 {
unsigned int irq; unsigned int irq;
struct semaphore adc_sem; struct semaphore adc_sem;
spinlock_t io_lock; spinlock_t io_lock;
const struct mcp_device_id *id; u16 id;
u16 io_dir; u16 io_dir;
u16 io_out; u16 io_out;
u16 adc_cr; u16 adc_cr;
......
...@@ -436,17 +436,6 @@ struct spi_device_id { ...@@ -436,17 +436,6 @@ struct spi_device_id {
__attribute__((aligned(sizeof(kernel_ulong_t)))); __attribute__((aligned(sizeof(kernel_ulong_t))));
}; };
/* mcp */
#define MCP_NAME_SIZE 20
#define MCP_MODULE_PREFIX "mcp:"
struct mcp_device_id {
char name[MCP_NAME_SIZE];
kernel_ulong_t driver_data /* Data private to the driver */
__attribute__((aligned(sizeof(kernel_ulong_t))));
};
/* dmi */ /* dmi */
enum dmi_field { enum dmi_field {
DMI_NONE, DMI_NONE,
......
...@@ -634,10 +634,11 @@ static int tracepoint_module_coming(struct module *mod) ...@@ -634,10 +634,11 @@ static int tracepoint_module_coming(struct module *mod)
int ret = 0; int ret = 0;
/* /*
* We skip modules that tain the kernel, especially those with different * We skip modules that taint the kernel, especially those with different
* module header (for forced load), to make sure we don't cause a crash. * module headers (for forced load), to make sure we don't cause a crash.
* Staging and out-of-tree GPL modules are fine.
*/ */
if (mod->taints) if (mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP)))
return 0; return 0;
mutex_lock(&tracepoints_mutex); mutex_lock(&tracepoints_mutex);
tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL); tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL);
......
...@@ -255,6 +255,8 @@ void *mpi_get_buffer(MPI a, unsigned *nbytes, int *sign) ...@@ -255,6 +255,8 @@ void *mpi_get_buffer(MPI a, unsigned *nbytes, int *sign)
if (!n) if (!n)
n++; /* avoid zero length allocation */ n++; /* avoid zero length allocation */
p = buffer = kmalloc(n, GFP_KERNEL); p = buffer = kmalloc(n, GFP_KERNEL);
if (!p)
return NULL;
for (i = a->nlimbs - 1; i >= 0; i--) { for (i = a->nlimbs - 1; i >= 0; i--) {
alimb = a->d[i]; alimb = a->d[i];
......
...@@ -823,16 +823,6 @@ static int do_spi_entry(const char *filename, struct spi_device_id *id, ...@@ -823,16 +823,6 @@ static int do_spi_entry(const char *filename, struct spi_device_id *id,
} }
ADD_TO_DEVTABLE("spi", struct spi_device_id, do_spi_entry); ADD_TO_DEVTABLE("spi", struct spi_device_id, do_spi_entry);
/* Looks like: mcp:S */
static int do_mcp_entry(const char *filename, struct mcp_device_id *id,
char *alias)
{
sprintf(alias, MCP_MODULE_PREFIX "%s", id->name);
return 1;
}
ADD_TO_DEVTABLE("mcp", struct mcp_device_id, do_mcp_entry);
static const struct dmifield { static const struct dmifield {
const char *prefix; const char *prefix;
int field; int field;
......
...@@ -99,6 +99,7 @@ static bool ima_match_rules(struct ima_measure_rule_entry *rule, ...@@ -99,6 +99,7 @@ static bool ima_match_rules(struct ima_measure_rule_entry *rule,
struct inode *inode, enum ima_hooks func, int mask) struct inode *inode, enum ima_hooks func, int mask)
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
const struct cred *cred = current_cred();
int i; int i;
if ((rule->flags & IMA_FUNC) && rule->func != func) if ((rule->flags & IMA_FUNC) && rule->func != func)
...@@ -108,7 +109,7 @@ static bool ima_match_rules(struct ima_measure_rule_entry *rule, ...@@ -108,7 +109,7 @@ static bool ima_match_rules(struct ima_measure_rule_entry *rule,
if ((rule->flags & IMA_FSMAGIC) if ((rule->flags & IMA_FSMAGIC)
&& rule->fsmagic != inode->i_sb->s_magic) && rule->fsmagic != inode->i_sb->s_magic)
return false; return false;
if ((rule->flags & IMA_UID) && rule->uid != tsk->cred->uid) if ((rule->flags & IMA_UID) && rule->uid != cred->uid)
return false; return false;
for (i = 0; i < MAX_LSM_RULES; i++) { for (i = 0; i < MAX_LSM_RULES; i++) {
int rc = 0; int rc = 0;
......
...@@ -59,7 +59,7 @@ int user_instantiate(struct key *key, const void *data, size_t datalen) ...@@ -59,7 +59,7 @@ int user_instantiate(struct key *key, const void *data, size_t datalen)
/* attach the data */ /* attach the data */
upayload->datalen = datalen; upayload->datalen = datalen;
memcpy(upayload->data, data, datalen); memcpy(upayload->data, data, datalen);
rcu_assign_pointer(key->payload.data, upayload); rcu_assign_keypointer(key, upayload);
ret = 0; ret = 0;
error: error:
...@@ -98,7 +98,7 @@ int user_update(struct key *key, const void *data, size_t datalen) ...@@ -98,7 +98,7 @@ int user_update(struct key *key, const void *data, size_t datalen)
if (ret == 0) { if (ret == 0) {
/* attach the new data, displacing the old */ /* attach the new data, displacing the old */
zap = key->payload.data; zap = key->payload.data;
rcu_assign_pointer(key->payload.data, upayload); rcu_assign_keypointer(key, upayload);
key->expiry = 0; key->expiry = 0;
} }
...@@ -133,7 +133,7 @@ void user_revoke(struct key *key) ...@@ -133,7 +133,7 @@ void user_revoke(struct key *key)
key_payload_reserve(key, 0); key_payload_reserve(key, 0);
if (upayload) { if (upayload) {
rcu_assign_pointer(key->payload.data, NULL); rcu_assign_keypointer(key, NULL);
kfree_rcu(upayload, rcu); kfree_rcu(upayload, rcu);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment