Merge branch 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6
* 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: (50 commits)
printk: do not mangle valid userspace syslog prefixes
efivars: Add Documentation
efivars: Expose efivars functionality to external drivers.
efivars: Parameterize operations.
efivars: Split out variable registration
efivars: parameterize efivars
efivars: Make efivars bin_attributes dynamic
efivars: move efivars globals into struct efivars
drivers:misc: ti-st: fix debugging code
kref: Fix typo in kref documentation
UIO: add PRUSS UIO driver support
Fix spelling mistakes in Documentation/zh_CN/SubmittingPatches
firmware: Fix unaligned memory accesses in dmi-sysfs
firmware: Add documentation for /sys/firmware/dmi
firmware: Expose DMI type 15 System Event Log
firmware: Break out system_event_log in dmi-sysfs
firmware: Basic dmi-sysfs support
firmware: Add DMI entry types to the headers
Driver core: convert platform_{get,set}_drvdata to static inline functions
Translate linux-2.6/Documentation/magic-number.txt into Chinese
...
This commit is contained in:
@@ -23,6 +23,53 @@ enum dmi_device_type {
|
||||
DMI_DEV_TYPE_DEV_ONBOARD = -3,
|
||||
};
|
||||
|
||||
enum dmi_entry_type {
|
||||
DMI_ENTRY_BIOS = 0,
|
||||
DMI_ENTRY_SYSTEM,
|
||||
DMI_ENTRY_BASEBOARD,
|
||||
DMI_ENTRY_CHASSIS,
|
||||
DMI_ENTRY_PROCESSOR,
|
||||
DMI_ENTRY_MEM_CONTROLLER,
|
||||
DMI_ENTRY_MEM_MODULE,
|
||||
DMI_ENTRY_CACHE,
|
||||
DMI_ENTRY_PORT_CONNECTOR,
|
||||
DMI_ENTRY_SYSTEM_SLOT,
|
||||
DMI_ENTRY_ONBOARD_DEVICE,
|
||||
DMI_ENTRY_OEMSTRINGS,
|
||||
DMI_ENTRY_SYSCONF,
|
||||
DMI_ENTRY_BIOS_LANG,
|
||||
DMI_ENTRY_GROUP_ASSOC,
|
||||
DMI_ENTRY_SYSTEM_EVENT_LOG,
|
||||
DMI_ENTRY_PHYS_MEM_ARRAY,
|
||||
DMI_ENTRY_MEM_DEVICE,
|
||||
DMI_ENTRY_32_MEM_ERROR,
|
||||
DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR,
|
||||
DMI_ENTRY_MEM_DEV_MAPPED_ADDR,
|
||||
DMI_ENTRY_BUILTIN_POINTING_DEV,
|
||||
DMI_ENTRY_PORTABLE_BATTERY,
|
||||
DMI_ENTRY_SYSTEM_RESET,
|
||||
DMI_ENTRY_HW_SECURITY,
|
||||
DMI_ENTRY_SYSTEM_POWER_CONTROLS,
|
||||
DMI_ENTRY_VOLTAGE_PROBE,
|
||||
DMI_ENTRY_COOLING_DEV,
|
||||
DMI_ENTRY_TEMP_PROBE,
|
||||
DMI_ENTRY_ELECTRICAL_CURRENT_PROBE,
|
||||
DMI_ENTRY_OOB_REMOTE_ACCESS,
|
||||
DMI_ENTRY_BIS_ENTRY,
|
||||
DMI_ENTRY_SYSTEM_BOOT,
|
||||
DMI_ENTRY_MGMT_DEV,
|
||||
DMI_ENTRY_MGMT_DEV_COMPONENT,
|
||||
DMI_ENTRY_MGMT_DEV_THRES,
|
||||
DMI_ENTRY_MEM_CHANNEL,
|
||||
DMI_ENTRY_IPMI_DEV,
|
||||
DMI_ENTRY_SYS_POWER_SUPPLY,
|
||||
DMI_ENTRY_ADDITIONAL,
|
||||
DMI_ENTRY_ONBOARD_DEV_EXT,
|
||||
DMI_ENTRY_MGMT_CONTROLLER_HOST,
|
||||
DMI_ENTRY_INACTIVE = 126,
|
||||
DMI_ENTRY_END_OF_TABLE = 127,
|
||||
};
|
||||
|
||||
struct dmi_header {
|
||||
u8 type;
|
||||
u8 length;
|
||||
|
||||
@@ -31,6 +31,10 @@ struct _ddebug {
|
||||
* writes commands to <debugfs>/dynamic_debug/control
|
||||
*/
|
||||
#define _DPRINTK_FLAGS_PRINT (1<<0) /* printk() a message using the format */
|
||||
#define _DPRINTK_FLAGS_INCL_MODNAME (1<<1)
|
||||
#define _DPRINTK_FLAGS_INCL_FUNCNAME (1<<2)
|
||||
#define _DPRINTK_FLAGS_INCL_LINENO (1<<3)
|
||||
#define _DPRINTK_FLAGS_INCL_TID (1<<4)
|
||||
#define _DPRINTK_FLAGS_DEFAULT 0
|
||||
unsigned int flags:8;
|
||||
char enabled;
|
||||
@@ -42,6 +46,8 @@ int ddebug_add_module(struct _ddebug *tab, unsigned int n,
|
||||
|
||||
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||
extern int ddebug_remove_module(const char *mod_name);
|
||||
extern int __dynamic_pr_debug(struct _ddebug *descriptor, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
|
||||
#define dynamic_pr_debug(fmt, ...) do { \
|
||||
static struct _ddebug descriptor \
|
||||
@@ -50,7 +56,7 @@ extern int ddebug_remove_module(const char *mod_name);
|
||||
{ KBUILD_MODNAME, __func__, __FILE__, fmt, __LINE__, \
|
||||
_DPRINTK_FLAGS_DEFAULT }; \
|
||||
if (unlikely(descriptor.enabled)) \
|
||||
printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \
|
||||
__dynamic_pr_debug(&descriptor, pr_fmt(fmt), ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
|
||||
|
||||
@@ -397,4 +397,41 @@ static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
|
||||
*addr &= PAGE_MASK;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_EFI_VARS) || defined(CONFIG_EFI_VARS_MODULE)
|
||||
/*
|
||||
* EFI Variable support.
|
||||
*
|
||||
* Different firmware drivers can expose their EFI-like variables using
|
||||
* the following.
|
||||
*/
|
||||
|
||||
struct efivar_operations {
|
||||
efi_get_variable_t *get_variable;
|
||||
efi_get_next_variable_t *get_next_variable;
|
||||
efi_set_variable_t *set_variable;
|
||||
};
|
||||
|
||||
struct efivars {
|
||||
/*
|
||||
* ->lock protects two things:
|
||||
* 1) ->list - adds, removals, reads, writes
|
||||
* 2) ops.[gs]et_variable() calls.
|
||||
* It must not be held when creating sysfs entries or calling kmalloc.
|
||||
* ops.get_next_variable() is only called from register_efivars(),
|
||||
* which is protected by the BKL, so that path is safe.
|
||||
*/
|
||||
spinlock_t lock;
|
||||
struct list_head list;
|
||||
struct kset *kset;
|
||||
struct bin_attribute *new_var, *del_var;
|
||||
const struct efivar_operations *ops;
|
||||
};
|
||||
|
||||
int register_efivars(struct efivars *efivars,
|
||||
const struct efivar_operations *ops,
|
||||
struct kobject *parent_kobj);
|
||||
void unregister_efivars(struct efivars *efivars);
|
||||
|
||||
#endif /* CONFIG_EFI_VARS */
|
||||
|
||||
#endif /* _LINUX_EFI_H */
|
||||
|
||||
@@ -39,7 +39,7 @@ struct builtin_fw {
|
||||
int request_firmware(const struct firmware **fw, const char *name,
|
||||
struct device *device);
|
||||
int request_firmware_nowait(
|
||||
struct module *module, int uevent,
|
||||
struct module *module, bool uevent,
|
||||
const char *name, struct device *device, gfp_t gfp, void *context,
|
||||
void (*cont)(const struct firmware *fw, void *context));
|
||||
|
||||
@@ -52,7 +52,7 @@ static inline int request_firmware(const struct firmware **fw,
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline int request_firmware_nowait(
|
||||
struct module *module, int uevent,
|
||||
struct module *module, bool uevent,
|
||||
const char *name, struct device *device, gfp_t gfp, void *context,
|
||||
void (*cont)(const struct firmware *fw, void *context))
|
||||
{
|
||||
|
||||
@@ -85,11 +85,13 @@ static inline const char *kobject_name(const struct kobject *kobj)
|
||||
extern void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
|
||||
extern int __must_check kobject_add(struct kobject *kobj,
|
||||
struct kobject *parent,
|
||||
const char *fmt, ...);
|
||||
const char *fmt, ...)
|
||||
__attribute__((format(printf, 3, 4)));
|
||||
extern int __must_check kobject_init_and_add(struct kobject *kobj,
|
||||
struct kobj_type *ktype,
|
||||
struct kobject *parent,
|
||||
const char *fmt, ...);
|
||||
const char *fmt, ...)
|
||||
__attribute__((format(printf, 4, 5)));
|
||||
|
||||
extern void kobject_del(struct kobject *kobj);
|
||||
|
||||
@@ -224,8 +226,8 @@ static inline int kobject_uevent_env(struct kobject *kobj,
|
||||
char *envp[])
|
||||
{ return 0; }
|
||||
|
||||
static inline int add_uevent_var(struct kobj_uevent_env *env,
|
||||
const char *format, ...)
|
||||
static inline __attribute__((format(printf, 2, 3)))
|
||||
int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)
|
||||
{ return 0; }
|
||||
|
||||
static inline int kobject_action_type(const char *buf, size_t count,
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
#include <linux/mutex.h>
|
||||
|
||||
struct memory_block {
|
||||
unsigned long phys_index;
|
||||
unsigned long start_section_nr;
|
||||
unsigned long end_section_nr;
|
||||
unsigned long state;
|
||||
int section_count;
|
||||
|
||||
|
||||
@@ -39,7 +39,8 @@ extern int register_cpu_under_node(unsigned int cpu, unsigned int nid);
|
||||
extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid);
|
||||
extern int register_mem_sect_under_node(struct memory_block *mem_blk,
|
||||
int nid);
|
||||
extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk);
|
||||
extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk,
|
||||
unsigned long phys_index);
|
||||
|
||||
#ifdef CONFIG_HUGETLBFS
|
||||
extern void register_hugetlbfs_with_node(node_registration_func_t doregister,
|
||||
@@ -67,7 +68,8 @@ static inline int register_mem_sect_under_node(struct memory_block *mem_blk,
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk)
|
||||
static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk,
|
||||
unsigned long phys_index)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
25
include/linux/platform_data/uio_pruss.h
Normal file
25
include/linux/platform_data/uio_pruss.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* include/linux/platform_data/uio_pruss.h
|
||||
*
|
||||
* Platform data for uio_pruss driver
|
||||
*
|
||||
* Copyright (C) 2010-11 Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation version 2.
|
||||
*
|
||||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
||||
* kind, whether express or implied; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _UIO_PRUSS_H_
|
||||
#define _UIO_PRUSS_H_
|
||||
|
||||
/* To configure the PRUSS INTC base offset for UIO driver */
|
||||
struct uio_pruss_pdata {
|
||||
u32 pintc_base;
|
||||
};
|
||||
#endif /* _UIO_PRUSS_H_ */
|
||||
@@ -130,8 +130,15 @@ extern void platform_driver_unregister(struct platform_driver *);
|
||||
extern int platform_driver_probe(struct platform_driver *driver,
|
||||
int (*probe)(struct platform_device *));
|
||||
|
||||
#define platform_get_drvdata(_dev) dev_get_drvdata(&(_dev)->dev)
|
||||
#define platform_set_drvdata(_dev,data) dev_set_drvdata(&(_dev)->dev, (data))
|
||||
static inline void *platform_get_drvdata(const struct platform_device *pdev)
|
||||
{
|
||||
return dev_get_drvdata(&pdev->dev);
|
||||
}
|
||||
|
||||
static inline void platform_set_drvdata(struct platform_device *pdev, void *data)
|
||||
{
|
||||
dev_set_drvdata(&pdev->dev, data);
|
||||
}
|
||||
|
||||
extern struct platform_device *platform_create_bundle(struct platform_driver *driver,
|
||||
int (*probe)(struct platform_device *),
|
||||
|
||||
@@ -25,15 +25,6 @@
|
||||
#ifndef TI_WILINK_ST_H
|
||||
#define TI_WILINK_ST_H
|
||||
|
||||
/**
|
||||
* enum kim_gpio_state - Few protocols such as FM have ACTIVE LOW
|
||||
* gpio states for their chip/core enable gpios
|
||||
*/
|
||||
enum kim_gpio_state {
|
||||
KIM_GPIO_INACTIVE,
|
||||
KIM_GPIO_ACTIVE,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum proto-type - The protocol on WiLink chips which share a
|
||||
* common physical interface like UART.
|
||||
@@ -42,7 +33,7 @@ enum proto_type {
|
||||
ST_BT,
|
||||
ST_FM,
|
||||
ST_GPS,
|
||||
ST_MAX,
|
||||
ST_MAX_CHANNELS = 16,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -62,6 +53,17 @@ enum proto_type {
|
||||
* @priv_data: privdate data holder for the protocol drivers, sent
|
||||
* from the protocol drivers during registration, and sent back on
|
||||
* reg_complete_cb and recv.
|
||||
* @chnl_id: channel id the protocol driver is interested in, the channel
|
||||
* id is nothing but the 1st byte of the packet in UART frame.
|
||||
* @max_frame_size: size of the largest frame the protocol can receive.
|
||||
* @hdr_len: length of the header structure of the protocol.
|
||||
* @offset_len_in_hdr: this provides the offset of the length field in the
|
||||
* header structure of the protocol header, to assist ST to know
|
||||
* how much to receive, if the data is split across UART frames.
|
||||
* @len_size: whether the length field inside the header is 2 bytes
|
||||
* or 1 byte.
|
||||
* @reserve: the number of bytes ST needs to reserve in the skb being
|
||||
* prepared for the protocol driver.
|
||||
*/
|
||||
struct st_proto_s {
|
||||
enum proto_type type;
|
||||
@@ -70,10 +72,17 @@ struct st_proto_s {
|
||||
void (*reg_complete_cb) (void *, char data);
|
||||
long (*write) (struct sk_buff *skb);
|
||||
void *priv_data;
|
||||
|
||||
unsigned char chnl_id;
|
||||
unsigned short max_frame_size;
|
||||
unsigned char hdr_len;
|
||||
unsigned char offset_len_in_hdr;
|
||||
unsigned char len_size;
|
||||
unsigned char reserve;
|
||||
};
|
||||
|
||||
extern long st_register(struct st_proto_s *);
|
||||
extern long st_unregister(enum proto_type);
|
||||
extern long st_unregister(struct st_proto_s *);
|
||||
|
||||
|
||||
/*
|
||||
@@ -114,6 +123,7 @@ extern long st_unregister(enum proto_type);
|
||||
* @rx_skb: the skb where all data for a protocol gets accumulated,
|
||||
* since tty might not call receive when a complete event packet
|
||||
* is received, the states, count and the skb needs to be maintained.
|
||||
* @rx_chnl: the channel ID for which the data is getting accumalated for.
|
||||
* @txq: the list of skbs which needs to be sent onto the TTY.
|
||||
* @tx_waitq: if the chip is not in AWAKE state, the skbs needs to be queued
|
||||
* up in here, PM(WAKEUP_IND) data needs to be sent and then the skbs
|
||||
@@ -135,10 +145,11 @@ struct st_data_s {
|
||||
#define ST_TX_SENDING 1
|
||||
#define ST_TX_WAKEUP 2
|
||||
unsigned long tx_state;
|
||||
struct st_proto_s *list[ST_MAX];
|
||||
struct st_proto_s *list[ST_MAX_CHANNELS];
|
||||
unsigned long rx_state;
|
||||
unsigned long rx_count;
|
||||
struct sk_buff *rx_skb;
|
||||
unsigned char rx_chnl;
|
||||
struct sk_buff_head txq, tx_waitq;
|
||||
spinlock_t lock;
|
||||
unsigned char protos_registered;
|
||||
@@ -146,6 +157,11 @@ struct st_data_s {
|
||||
void *kim_data;
|
||||
};
|
||||
|
||||
/*
|
||||
* wrapper around tty->ops->write_room to check
|
||||
* availability during firmware download
|
||||
*/
|
||||
int st_get_uart_wr_room(struct st_data_s *st_gdata);
|
||||
/**
|
||||
* st_int_write -
|
||||
* point this to tty->driver->write or tty->ops->write
|
||||
@@ -186,8 +202,9 @@ void gps_chrdrv_stub_init(void);
|
||||
/* time in msec to wait for
|
||||
* line discipline to be installed
|
||||
*/
|
||||
#define LDISC_TIME 500
|
||||
#define CMD_RESP_TIME 500
|
||||
#define LDISC_TIME 1000
|
||||
#define CMD_RESP_TIME 800
|
||||
#define CMD_WR_TIME 5000
|
||||
#define MAKEWORD(a, b) ((unsigned short)(((unsigned char)(a)) \
|
||||
| ((unsigned short)((unsigned char)(b))) << 8))
|
||||
|
||||
@@ -210,6 +227,7 @@ struct chip_version {
|
||||
unsigned short maj_ver;
|
||||
};
|
||||
|
||||
#define UART_DEV_NAME_LEN 32
|
||||
/**
|
||||
* struct kim_data_s - the KIM internal data, embedded as the
|
||||
* platform's drv data. One for each ST device in the system.
|
||||
@@ -225,14 +243,11 @@ struct chip_version {
|
||||
* the ldisc was properly installed.
|
||||
* @resp_buffer: data buffer for the .bts fw file name.
|
||||
* @fw_entry: firmware class struct to request/release the fw.
|
||||
* @gpios: the list of core/chip enable gpios for BT, FM and GPS cores.
|
||||
* @rx_state: the rx state for kim's receive func during fw download.
|
||||
* @rx_count: the rx count for the kim's receive func during fw download.
|
||||
* @rx_skb: all of fw data might not come at once, and hence data storage for
|
||||
* whole of the fw response, only HCI_EVENTs and hence diff from ST's
|
||||
* response.
|
||||
* @rfkill: rfkill data for each of the cores to be registered with rfkill.
|
||||
* @rf_protos: proto types of the data registered with rfkill sub-system.
|
||||
* @core_data: ST core's data, which mainly is the tty's disc_data
|
||||
* @version: chip version available via a sysfs entry.
|
||||
*
|
||||
@@ -243,14 +258,16 @@ struct kim_data_s {
|
||||
struct completion kim_rcvd, ldisc_installed;
|
||||
char resp_buffer[30];
|
||||
const struct firmware *fw_entry;
|
||||
long gpios[ST_MAX];
|
||||
long nshutdown;
|
||||
unsigned long rx_state;
|
||||
unsigned long rx_count;
|
||||
struct sk_buff *rx_skb;
|
||||
struct rfkill *rfkill[ST_MAX];
|
||||
enum proto_type rf_protos[ST_MAX];
|
||||
struct st_data_s *core_data;
|
||||
struct chip_version version;
|
||||
unsigned char ldisc_install;
|
||||
unsigned char dev_name[UART_DEV_NAME_LEN];
|
||||
unsigned char flow_cntrl;
|
||||
unsigned long baud_rate;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -262,7 +279,6 @@ long st_kim_start(void *);
|
||||
long st_kim_stop(void *);
|
||||
|
||||
void st_kim_recv(void *, const unsigned char *, long count);
|
||||
void st_kim_chip_toggle(enum proto_type, enum kim_gpio_state);
|
||||
void st_kim_complete(void *);
|
||||
void kim_st_list_protocols(struct st_data_s *, void *);
|
||||
|
||||
@@ -338,12 +354,8 @@ struct hci_command {
|
||||
|
||||
/* ST LL receiver states */
|
||||
#define ST_W4_PACKET_TYPE 0
|
||||
#define ST_BT_W4_EVENT_HDR 1
|
||||
#define ST_BT_W4_ACL_HDR 2
|
||||
#define ST_BT_W4_SCO_HDR 3
|
||||
#define ST_BT_W4_DATA 4
|
||||
#define ST_FM_W4_EVENT_HDR 5
|
||||
#define ST_GPS_W4_EVENT_HDR 6
|
||||
#define ST_W4_HEADER 1
|
||||
#define ST_W4_DATA 2
|
||||
|
||||
/* ST LL state machines */
|
||||
#define ST_LL_ASLEEP 0
|
||||
@@ -397,4 +409,14 @@ struct gps_event_hdr {
|
||||
u16 plen;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* platform data */
|
||||
struct ti_st_plat_data {
|
||||
long nshutdown_gpio;
|
||||
unsigned char dev_name[UART_DEV_NAME_LEN]; /* uart name */
|
||||
unsigned char flow_cntrl; /* flow control flag */
|
||||
unsigned long baud_rate;
|
||||
int (*suspend)(struct platform_device *, pm_message_t);
|
||||
int (*resume)(struct platform_device *);
|
||||
};
|
||||
|
||||
#endif /* TI_WILINK_ST_H */
|
||||
|
||||
Reference in New Issue
Block a user