Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
@@ -0,0 +1,248 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Name: acconfig.h - Global configuration constants
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2012, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef _ACCONFIG_H
|
||||
#define _ACCONFIG_H
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Configuration options
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* ACPI_DEBUG_OUTPUT - This switch enables all the debug facilities of the
|
||||
* ACPI subsystem. This includes the DEBUG_PRINT output
|
||||
* statements. When disabled, all DEBUG_PRINT
|
||||
* statements are compiled out.
|
||||
*
|
||||
* ACPI_APPLICATION - Use this switch if the subsystem is going to be run
|
||||
* at the application level.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* OS name, used for the _OS object. The _OS object is essentially obsolete,
|
||||
* but there is a large base of ASL/AML code in existing machines that check
|
||||
* for the string below. The use of this string usually guarantees that
|
||||
* the ASL will execute down the most tested code path. Also, there is some
|
||||
* code that will not execute the _OSI method unless _OS matches the string
|
||||
* below. Therefore, change this string at your own risk.
|
||||
*/
|
||||
#define ACPI_OS_NAME "Microsoft Windows NT"
|
||||
|
||||
/* Maximum objects in the various object caches */
|
||||
|
||||
#define ACPI_MAX_STATE_CACHE_DEPTH 96 /* State objects */
|
||||
#define ACPI_MAX_PARSE_CACHE_DEPTH 96 /* Parse tree objects */
|
||||
#define ACPI_MAX_EXTPARSE_CACHE_DEPTH 96 /* Parse tree objects */
|
||||
#define ACPI_MAX_OBJECT_CACHE_DEPTH 96 /* Interpreter operand objects */
|
||||
#define ACPI_MAX_NAMESPACE_CACHE_DEPTH 96 /* Namespace objects */
|
||||
|
||||
/*
|
||||
* Should the subsystem abort the loading of an ACPI table if the
|
||||
* table checksum is incorrect?
|
||||
*/
|
||||
#define ACPI_CHECKSUM_ABORT FALSE
|
||||
|
||||
/*
|
||||
* Generate a version of ACPICA that only supports "reduced hardware"
|
||||
* platforms (as defined in ACPI 5.0). Set to TRUE to generate a specialized
|
||||
* version of ACPICA that ONLY supports the ACPI 5.0 "reduced hardware"
|
||||
* model. In other words, no ACPI hardware is supported.
|
||||
*
|
||||
* If TRUE, this means no support for the following:
|
||||
* PM Event and Control registers
|
||||
* SCI interrupt (and handler)
|
||||
* Fixed Events
|
||||
* General Purpose Events (GPEs)
|
||||
* Global Lock
|
||||
* ACPI PM timer
|
||||
* FACS table (Waking vectors and Global Lock)
|
||||
*/
|
||||
#define ACPI_REDUCED_HARDWARE FALSE
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Subsystem Constants
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/* Version of ACPI supported */
|
||||
|
||||
#define ACPI_CA_SUPPORT_LEVEL 5
|
||||
|
||||
/* Maximum count for a semaphore object */
|
||||
|
||||
#define ACPI_MAX_SEMAPHORE_COUNT 256
|
||||
|
||||
/* Maximum object reference count (detects object deletion issues) */
|
||||
|
||||
#define ACPI_MAX_REFERENCE_COUNT 0x1000
|
||||
|
||||
/* Default page size for use in mapping memory for operation regions */
|
||||
|
||||
#define ACPI_DEFAULT_PAGE_SIZE 4096 /* Must be power of 2 */
|
||||
|
||||
/* owner_id tracking. 8 entries allows for 255 owner_ids */
|
||||
|
||||
#define ACPI_NUM_OWNERID_MASKS 8
|
||||
|
||||
/* Size of the root table array is increased by this increment */
|
||||
|
||||
#define ACPI_ROOT_TABLE_SIZE_INCREMENT 4
|
||||
|
||||
/* Maximum number of While() loop iterations before forced abort */
|
||||
|
||||
#define ACPI_MAX_LOOP_ITERATIONS 0xFFFF
|
||||
|
||||
/* Maximum sleep allowed via Sleep() operator */
|
||||
|
||||
#define ACPI_MAX_SLEEP 2000 /* Two seconds */
|
||||
|
||||
/* Address Range lists are per-space_id (Memory and I/O only) */
|
||||
|
||||
#define ACPI_ADDRESS_RANGE_MAX 2
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* ACPI Specification constants (Do not change unless the specification changes)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/* Number of distinct GPE register blocks and register width */
|
||||
|
||||
#define ACPI_MAX_GPE_BLOCKS 2
|
||||
#define ACPI_GPE_REGISTER_WIDTH 8
|
||||
|
||||
/* Method info (in WALK_STATE), containing local variables and argumetns */
|
||||
|
||||
#define ACPI_METHOD_NUM_LOCALS 8
|
||||
#define ACPI_METHOD_MAX_LOCAL 7
|
||||
|
||||
#define ACPI_METHOD_NUM_ARGS 7
|
||||
#define ACPI_METHOD_MAX_ARG 6
|
||||
|
||||
/* Length of _HID, _UID, _CID, and UUID values */
|
||||
|
||||
#define ACPI_DEVICE_ID_LENGTH 0x09
|
||||
#define ACPI_MAX_CID_LENGTH 48
|
||||
#define ACPI_UUID_LENGTH 16
|
||||
|
||||
/*
|
||||
* Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG
|
||||
*/
|
||||
#define ACPI_OBJ_NUM_OPERANDS 8
|
||||
#define ACPI_OBJ_MAX_OPERAND 7
|
||||
|
||||
/* Number of elements in the Result Stack frame, can be an arbitrary value */
|
||||
|
||||
#define ACPI_RESULTS_FRAME_OBJ_NUM 8
|
||||
|
||||
/*
|
||||
* Maximal number of elements the Result Stack can contain,
|
||||
* it may be an arbitray value not exceeding the types of
|
||||
* result_size and result_count (now u8).
|
||||
*/
|
||||
#define ACPI_RESULTS_OBJ_NUM_MAX 255
|
||||
|
||||
/* Names within the namespace are 4 bytes long */
|
||||
|
||||
#define ACPI_NAME_SIZE 4
|
||||
#define ACPI_PATH_SEGMENT_LENGTH 5 /* 4 chars for name + 1 char for separator */
|
||||
#define ACPI_PATH_SEPARATOR '.'
|
||||
|
||||
/* Sizes for ACPI table headers */
|
||||
|
||||
#define ACPI_OEM_ID_SIZE 6
|
||||
#define ACPI_OEM_TABLE_ID_SIZE 8
|
||||
|
||||
/* Constants used in searching for the RSDP in low memory */
|
||||
|
||||
#define ACPI_EBDA_PTR_LOCATION 0x0000040E /* Physical Address */
|
||||
#define ACPI_EBDA_PTR_LENGTH 2
|
||||
#define ACPI_EBDA_WINDOW_SIZE 1024
|
||||
#define ACPI_HI_RSDP_WINDOW_BASE 0x000E0000 /* Physical Address */
|
||||
#define ACPI_HI_RSDP_WINDOW_SIZE 0x00020000
|
||||
#define ACPI_RSDP_SCAN_STEP 16
|
||||
|
||||
/* Operation regions */
|
||||
|
||||
#define ACPI_USER_REGION_BEGIN 0x80
|
||||
|
||||
/* Maximum space_ids for Operation Regions */
|
||||
|
||||
#define ACPI_MAX_ADDRESS_SPACE 255
|
||||
|
||||
/* Array sizes. Used for range checking also */
|
||||
|
||||
#define ACPI_MAX_MATCH_OPCODE 5
|
||||
|
||||
/* RSDP checksums */
|
||||
|
||||
#define ACPI_RSDP_CHECKSUM_LENGTH 20
|
||||
#define ACPI_RSDP_XCHECKSUM_LENGTH 36
|
||||
|
||||
/* SMBus, GSBus and IPMI bidirectional buffer size */
|
||||
|
||||
#define ACPI_SMBUS_BUFFER_SIZE 34
|
||||
#define ACPI_GSBUS_BUFFER_SIZE 34
|
||||
#define ACPI_IPMI_BUFFER_SIZE 66
|
||||
|
||||
/* _sx_d and _sx_w control methods */
|
||||
|
||||
#define ACPI_NUM_sx_d_METHODS 4
|
||||
#define ACPI_NUM_sx_w_METHODS 5
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* ACPI AML Debugger
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define ACPI_DEBUGGER_MAX_ARGS 8 /* Must be max method args + 1 */
|
||||
|
||||
#define ACPI_DEBUGGER_COMMAND_PROMPT '-'
|
||||
#define ACPI_DEBUGGER_EXECUTE_PROMPT '%'
|
||||
|
||||
#endif /* _ACCONFIG_H */
|
||||
@@ -57,6 +57,7 @@
|
||||
#define ACPI_SUCCESS(a) (!(a))
|
||||
#define ACPI_FAILURE(a) (a)
|
||||
|
||||
#define ACPI_SKIP(a) (a == AE_CTRL_SKIP)
|
||||
#define AE_OK (acpi_status) 0x0000
|
||||
|
||||
/*
|
||||
@@ -89,8 +90,9 @@
|
||||
#define AE_SAME_HANDLER (acpi_status) (0x0019 | AE_CODE_ENVIRONMENTAL)
|
||||
#define AE_NO_HANDLER (acpi_status) (0x001A | AE_CODE_ENVIRONMENTAL)
|
||||
#define AE_OWNER_ID_LIMIT (acpi_status) (0x001B | AE_CODE_ENVIRONMENTAL)
|
||||
#define AE_NOT_CONFIGURED (acpi_status) (0x001C | AE_CODE_ENVIRONMENTAL)
|
||||
|
||||
#define AE_CODE_ENV_MAX 0x001B
|
||||
#define AE_CODE_ENV_MAX 0x001C
|
||||
|
||||
/*
|
||||
* Programmer exceptions
|
||||
@@ -213,7 +215,8 @@ char const *acpi_gbl_exception_names_env[] = {
|
||||
"AE_ABORT_METHOD",
|
||||
"AE_SAME_HANDLER",
|
||||
"AE_NO_HANDLER",
|
||||
"AE_OWNER_ID_LIMIT"
|
||||
"AE_OWNER_ID_LIMIT",
|
||||
"AE_NOT_CONFIGURED"
|
||||
};
|
||||
|
||||
char const *acpi_gbl_exception_names_pgm[] = {
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
|
||||
/* Method names - these methods can appear anywhere in the namespace */
|
||||
|
||||
#define METHOD_NAME__SB_ "_SB_"
|
||||
#define METHOD_NAME__HID "_HID"
|
||||
#define METHOD_NAME__CID "_CID"
|
||||
#define METHOD_NAME__UID "_UID"
|
||||
@@ -64,11 +65,11 @@
|
||||
|
||||
/* Method names - these methods must appear at the namespace root */
|
||||
|
||||
#define METHOD_NAME__BFS "\\_BFS"
|
||||
#define METHOD_NAME__GTS "\\_GTS"
|
||||
#define METHOD_NAME__PTS "\\_PTS"
|
||||
#define METHOD_NAME__SST "\\_SI._SST"
|
||||
#define METHOD_NAME__WAK "\\_WAK"
|
||||
#define METHOD_PATHNAME__BFS "\\_BFS"
|
||||
#define METHOD_PATHNAME__GTS "\\_GTS"
|
||||
#define METHOD_PATHNAME__PTS "\\_PTS"
|
||||
#define METHOD_PATHNAME__SST "\\_SI._SST"
|
||||
#define METHOD_PATHNAME__WAK "\\_WAK"
|
||||
|
||||
/* Definitions of the predefined namespace names */
|
||||
|
||||
@@ -79,6 +80,5 @@
|
||||
#define ACPI_PREFIX_LOWER (u32) 0x69706361 /* "acpi" */
|
||||
|
||||
#define ACPI_NS_ROOT_PATH "\\"
|
||||
#define ACPI_NS_SYSTEM_BUS "_SB_"
|
||||
|
||||
#endif /* __ACNAMES_H__ */
|
||||
|
||||
@@ -323,6 +323,8 @@ int acpi_bus_set_power(acpi_handle handle, int state);
|
||||
int acpi_bus_update_power(acpi_handle handle, int *state_p);
|
||||
bool acpi_bus_power_manageable(acpi_handle handle);
|
||||
bool acpi_bus_can_wakeup(acpi_handle handle);
|
||||
int acpi_power_resource_register_device(struct device *dev, acpi_handle handle);
|
||||
void acpi_power_resource_unregister_device(struct device *dev, acpi_handle handle);
|
||||
#ifdef CONFIG_ACPI_PROC_EVENT
|
||||
int acpi_bus_generate_proc_event(struct acpi_device *device, u8 type, int data);
|
||||
int acpi_bus_generate_proc_event4(const char *class, const char *bid, u8 type, int data);
|
||||
@@ -392,8 +394,13 @@ static inline int acpi_pm_device_sleep_state(struct device *d, int *p)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
int acpi_pm_device_run_wake(struct device *, bool);
|
||||
int acpi_pm_device_sleep_wake(struct device *, bool);
|
||||
#else
|
||||
static inline int acpi_pm_device_run_wake(struct device *dev, bool enable)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
|
||||
{
|
||||
return -ENODEV;
|
||||
|
||||
@@ -95,6 +95,11 @@ acpi_status
|
||||
acpi_os_table_override(struct acpi_table_header *existing_table,
|
||||
struct acpi_table_header **new_table);
|
||||
|
||||
acpi_status
|
||||
acpi_os_physical_table_override(struct acpi_table_header *existing_table,
|
||||
acpi_physical_address * new_address,
|
||||
u32 *new_table_length);
|
||||
|
||||
/*
|
||||
* Spinlock primitives
|
||||
*/
|
||||
@@ -217,14 +222,10 @@ acpi_status acpi_os_write_port(acpi_io_address address, u32 value, u32 width);
|
||||
* Platform and hardware-independent physical memory interfaces
|
||||
*/
|
||||
acpi_status
|
||||
acpi_os_read_memory(acpi_physical_address address, u32 * value, u32 width);
|
||||
acpi_status
|
||||
acpi_os_read_memory64(acpi_physical_address address, u64 *value, u32 width);
|
||||
acpi_os_read_memory(acpi_physical_address address, u64 *value, u32 width);
|
||||
|
||||
acpi_status
|
||||
acpi_os_write_memory(acpi_physical_address address, u32 value, u32 width);
|
||||
acpi_status
|
||||
acpi_os_write_memory64(acpi_physical_address address, u64 value, u32 width);
|
||||
acpi_os_write_memory(acpi_physical_address address, u64 value, u32 width);
|
||||
|
||||
/*
|
||||
* Platform and hardware-independent PCI configuration space access
|
||||
|
||||
+149
-58
@@ -47,8 +47,9 @@
|
||||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20120111
|
||||
#define ACPI_CA_VERSION 0x20120320
|
||||
|
||||
#include "acconfig.h"
|
||||
#include "actypes.h"
|
||||
#include "actbl.h"
|
||||
|
||||
@@ -71,6 +72,33 @@ extern u8 acpi_gbl_copy_dsdt_locally;
|
||||
extern u8 acpi_gbl_truncate_io_addresses;
|
||||
extern u8 acpi_gbl_disable_auto_repair;
|
||||
|
||||
/*
|
||||
* Hardware-reduced prototypes. All interfaces that use these macros will
|
||||
* be configured out of the ACPICA build if the ACPI_REDUCED_HARDWARE flag
|
||||
* is set to TRUE.
|
||||
*/
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
#define ACPI_HW_DEPENDENT_RETURN_STATUS(prototype) \
|
||||
prototype;
|
||||
|
||||
#define ACPI_HW_DEPENDENT_RETURN_OK(prototype) \
|
||||
prototype;
|
||||
|
||||
#define ACPI_HW_DEPENDENT_RETURN_VOID(prototype) \
|
||||
prototype;
|
||||
|
||||
#else
|
||||
#define ACPI_HW_DEPENDENT_RETURN_STATUS(prototype) \
|
||||
static ACPI_INLINE prototype {return(AE_NOT_CONFIGURED);}
|
||||
|
||||
#define ACPI_HW_DEPENDENT_RETURN_OK(prototype) \
|
||||
static ACPI_INLINE prototype {return(AE_OK);}
|
||||
|
||||
#define ACPI_HW_DEPENDENT_RETURN_VOID(prototype) \
|
||||
static ACPI_INLINE prototype {}
|
||||
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
extern u32 acpi_current_gpe_count;
|
||||
extern struct acpi_table_fadt acpi_gbl_FADT;
|
||||
extern u8 acpi_gbl_system_awake_and_running;
|
||||
@@ -96,9 +124,8 @@ acpi_status acpi_terminate(void);
|
||||
acpi_status acpi_subsystem_status(void);
|
||||
#endif
|
||||
|
||||
acpi_status acpi_enable(void);
|
||||
|
||||
acpi_status acpi_disable(void);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable(void))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_disable(void))
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status acpi_get_system_info(struct acpi_buffer *ret_buffer);
|
||||
@@ -235,17 +262,34 @@ acpi_status acpi_get_parent(acpi_handle object, acpi_handle * out_handle);
|
||||
acpi_status
|
||||
acpi_install_initialization_handler(acpi_init_handler handler, u32 function);
|
||||
|
||||
acpi_status
|
||||
acpi_install_global_event_handler(ACPI_GBL_EVENT_HANDLER handler,
|
||||
void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_install_fixed_event_handler(u32 acpi_event,
|
||||
acpi_event_handler handler, void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_remove_fixed_event_handler(u32 acpi_event, acpi_event_handler handler);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_install_global_event_handler
|
||||
(ACPI_GBL_EVENT_HANDLER handler, void *context))
|
||||
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_install_fixed_event_handler(u32
|
||||
acpi_event,
|
||||
acpi_event_handler
|
||||
handler,
|
||||
void
|
||||
*context))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_remove_fixed_event_handler(u32 acpi_event,
|
||||
acpi_event_handler
|
||||
handler))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_install_gpe_handler(acpi_handle
|
||||
gpe_device,
|
||||
u32 gpe_number,
|
||||
u32 type,
|
||||
acpi_gpe_handler
|
||||
address,
|
||||
void *context))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_remove_gpe_handler(acpi_handle gpe_device,
|
||||
u32 gpe_number,
|
||||
acpi_gpe_handler
|
||||
address))
|
||||
acpi_status
|
||||
acpi_install_notify_handler(acpi_handle device,
|
||||
u32 handler_type,
|
||||
@@ -266,15 +310,6 @@ acpi_remove_address_space_handler(acpi_handle device,
|
||||
acpi_adr_space_type space_id,
|
||||
acpi_adr_space_handler handler);
|
||||
|
||||
acpi_status
|
||||
acpi_install_gpe_handler(acpi_handle gpe_device,
|
||||
u32 gpe_number,
|
||||
u32 type, acpi_gpe_handler address, void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_remove_gpe_handler(acpi_handle gpe_device,
|
||||
u32 gpe_number, acpi_gpe_handler address);
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
acpi_status acpi_install_exception_handler(acpi_exception_handler handler);
|
||||
#endif
|
||||
@@ -284,9 +319,11 @@ acpi_status acpi_install_interface_handler(acpi_interface_handler handler);
|
||||
/*
|
||||
* Global Lock interfaces
|
||||
*/
|
||||
acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle);
|
||||
|
||||
acpi_status acpi_release_global_lock(u32 handle);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_acquire_global_lock(u16 timeout,
|
||||
u32 *handle))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_release_global_lock(u32 handle))
|
||||
|
||||
/*
|
||||
* Interfaces to AML mutex objects
|
||||
@@ -299,47 +336,75 @@ acpi_status acpi_release_mutex(acpi_handle handle, acpi_string pathname);
|
||||
/*
|
||||
* Fixed Event interfaces
|
||||
*/
|
||||
acpi_status acpi_enable_event(u32 event, u32 flags);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_enable_event(u32 event, u32 flags))
|
||||
|
||||
acpi_status acpi_disable_event(u32 event, u32 flags);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_disable_event(u32 event, u32 flags))
|
||||
|
||||
acpi_status acpi_clear_event(u32 event);
|
||||
|
||||
acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_clear_event(u32 event))
|
||||
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_get_event_status(u32 event,
|
||||
acpi_event_status
|
||||
*event_status))
|
||||
/*
|
||||
* General Purpose Event (GPE) Interfaces
|
||||
*/
|
||||
acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_update_all_gpes(void))
|
||||
|
||||
acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_enable_gpe(acpi_handle gpe_device,
|
||||
u32 gpe_number))
|
||||
|
||||
acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_disable_gpe(acpi_handle gpe_device,
|
||||
u32 gpe_number))
|
||||
|
||||
acpi_status
|
||||
acpi_setup_gpe_for_wake(acpi_handle parent_device,
|
||||
acpi_handle gpe_device, u32 gpe_number);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_clear_gpe(acpi_handle gpe_device,
|
||||
u32 gpe_number))
|
||||
|
||||
acpi_status acpi_set_gpe_wake_mask(acpi_handle gpe_device, u32 gpe_number, u8 action);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_set_gpe(acpi_handle gpe_device,
|
||||
u32 gpe_number, u8 action))
|
||||
|
||||
acpi_status
|
||||
acpi_get_gpe_status(acpi_handle gpe_device,
|
||||
u32 gpe_number, acpi_event_status *event_status);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_finish_gpe(acpi_handle gpe_device,
|
||||
u32 gpe_number))
|
||||
|
||||
acpi_status acpi_disable_all_gpes(void);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_setup_gpe_for_wake(acpi_handle
|
||||
parent_device,
|
||||
acpi_handle gpe_device,
|
||||
u32 gpe_number))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_set_gpe_wake_mask(acpi_handle gpe_device,
|
||||
u32 gpe_number,
|
||||
u8 action))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_get_gpe_status(acpi_handle gpe_device,
|
||||
u32 gpe_number,
|
||||
acpi_event_status
|
||||
*event_status))
|
||||
|
||||
acpi_status acpi_enable_all_runtime_gpes(void);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_disable_all_gpes(void))
|
||||
|
||||
acpi_status acpi_get_gpe_device(u32 gpe_index, acpi_handle *gpe_device);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable_all_runtime_gpes(void))
|
||||
|
||||
acpi_status
|
||||
acpi_install_gpe_block(acpi_handle gpe_device,
|
||||
struct acpi_generic_address *gpe_block_address,
|
||||
u32 register_count, u32 interrupt_number);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_get_gpe_device(u32 gpe_index,
|
||||
acpi_handle * gpe_device))
|
||||
|
||||
acpi_status acpi_remove_gpe_block(acpi_handle gpe_device);
|
||||
|
||||
acpi_status acpi_update_all_gpes(void);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_install_gpe_block(acpi_handle gpe_device,
|
||||
struct
|
||||
acpi_generic_address
|
||||
*gpe_block_address,
|
||||
u32 register_count,
|
||||
u32 interrupt_number))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_remove_gpe_block(acpi_handle gpe_device))
|
||||
|
||||
/*
|
||||
* Resource interfaces
|
||||
@@ -391,33 +456,59 @@ acpi_buffer_to_resource(u8 *aml_buffer,
|
||||
*/
|
||||
acpi_status acpi_reset(void);
|
||||
|
||||
acpi_status acpi_read_bit_register(u32 register_id, u32 *return_value);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_read_bit_register(u32 register_id,
|
||||
u32 *return_value))
|
||||
|
||||
acpi_status acpi_write_bit_register(u32 register_id, u32 value);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_write_bit_register(u32 register_id,
|
||||
u32 value))
|
||||
|
||||
acpi_status acpi_set_firmware_waking_vector(u32 physical_address);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_set_firmware_waking_vector(u32
|
||||
physical_address))
|
||||
|
||||
#if ACPI_MACHINE_WIDTH == 64
|
||||
acpi_status acpi_set_firmware_waking_vector64(u64 physical_address);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_set_firmware_waking_vector64(u64
|
||||
physical_address))
|
||||
#endif
|
||||
|
||||
acpi_status acpi_read(u64 *value, struct acpi_generic_address *reg);
|
||||
|
||||
acpi_status acpi_write(u64 value, struct acpi_generic_address *reg);
|
||||
|
||||
/*
|
||||
* Sleep/Wake interfaces
|
||||
*/
|
||||
acpi_status
|
||||
acpi_get_sleep_type_data(u8 sleep_state, u8 * slp_typ_a, u8 * slp_typ_b);
|
||||
|
||||
acpi_status acpi_enter_sleep_state_prep(u8 sleep_state);
|
||||
|
||||
acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state);
|
||||
acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state, u8 flags);
|
||||
|
||||
acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void);
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void))
|
||||
|
||||
acpi_status acpi_leave_sleep_state_prep(u8 sleep_state);
|
||||
acpi_status acpi_leave_sleep_state_prep(u8 sleep_state, u8 flags);
|
||||
|
||||
acpi_status acpi_leave_sleep_state(u8 sleep_state);
|
||||
|
||||
/*
|
||||
* ACPI Timer interfaces
|
||||
*/
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_get_timer_resolution(u32 *resolution))
|
||||
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_get_timer(u32 *ticks))
|
||||
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_get_timer_duration(u32 start_ticks,
|
||||
u32 end_ticks,
|
||||
u32 *time_elapsed))
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
/*
|
||||
* Error/Warning output
|
||||
*/
|
||||
|
||||
@@ -309,6 +309,13 @@ enum acpi_prefered_pm_profiles {
|
||||
PM_TABLET = 8
|
||||
};
|
||||
|
||||
/* Values for sleep_status and sleep_control registers (V5 FADT) */
|
||||
|
||||
#define ACPI_X_WAKE_STATUS 0x80
|
||||
#define ACPI_X_SLEEP_TYPE_MASK 0x1C
|
||||
#define ACPI_X_SLEEP_TYPE_POSITION 0x02
|
||||
#define ACPI_X_SLEEP_ENABLE 0x20
|
||||
|
||||
/* Reset to default packing */
|
||||
|
||||
#pragma pack()
|
||||
|
||||
+20
-2
@@ -517,6 +517,13 @@ typedef u64 acpi_integer;
|
||||
#define ACPI_SLEEP_TYPE_MAX 0x7
|
||||
#define ACPI_SLEEP_TYPE_INVALID 0xFF
|
||||
|
||||
/*
|
||||
* Sleep/Wake flags
|
||||
*/
|
||||
#define ACPI_NO_OPTIONAL_METHODS 0x00 /* Do not execute any optional methods */
|
||||
#define ACPI_EXECUTE_GTS 0x01 /* For enter sleep interface */
|
||||
#define ACPI_EXECUTE_BFS 0x02 /* For leave sleep prep interface */
|
||||
|
||||
/*
|
||||
* Standard notify values
|
||||
*/
|
||||
@@ -532,8 +539,9 @@ typedef u64 acpi_integer;
|
||||
#define ACPI_NOTIFY_DEVICE_PLD_CHECK (u8) 0x09
|
||||
#define ACPI_NOTIFY_RESERVED (u8) 0x0A
|
||||
#define ACPI_NOTIFY_LOCALITY_UPDATE (u8) 0x0B
|
||||
#define ACPI_NOTIFY_SHUTDOWN_REQUEST (u8) 0x0C
|
||||
|
||||
#define ACPI_NOTIFY_MAX 0x0B
|
||||
#define ACPI_NOTIFY_MAX 0x0C
|
||||
|
||||
/*
|
||||
* Types associated with ACPI names and objects. The first group of
|
||||
@@ -698,7 +706,8 @@ typedef u32 acpi_event_status;
|
||||
#define ACPI_ALL_NOTIFY (ACPI_SYSTEM_NOTIFY | ACPI_DEVICE_NOTIFY)
|
||||
#define ACPI_MAX_NOTIFY_HANDLER_TYPE 0x3
|
||||
|
||||
#define ACPI_MAX_SYS_NOTIFY 0x7f
|
||||
#define ACPI_MAX_SYS_NOTIFY 0x7F
|
||||
#define ACPI_MAX_DEVICE_SPECIFIC_NOTIFY 0xBF
|
||||
|
||||
/* Address Space (Operation Region) Types */
|
||||
|
||||
@@ -786,6 +795,15 @@ typedef u8 acpi_adr_space_type;
|
||||
#define ACPI_ENABLE_EVENT 1
|
||||
#define ACPI_DISABLE_EVENT 0
|
||||
|
||||
/* Sleep function dispatch */
|
||||
|
||||
typedef acpi_status(*ACPI_SLEEP_FUNCTION) (u8 sleep_state, u8 flags);
|
||||
|
||||
struct acpi_sleep_functions {
|
||||
ACPI_SLEEP_FUNCTION legacy_function;
|
||||
ACPI_SLEEP_FUNCTION extended_function;
|
||||
};
|
||||
|
||||
/*
|
||||
* External ACPI object definition
|
||||
*/
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/sched.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/acpi.h>
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
#ifndef __ASM_GENERIC_ATOMIC_H
|
||||
#define __ASM_GENERIC_ATOMIC_H
|
||||
|
||||
#include <asm/cmpxchg.h>
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Force people to define core atomics */
|
||||
# if !defined(atomic_add_return) || !defined(atomic_sub_return) || \
|
||||
@@ -52,7 +54,6 @@
|
||||
#define atomic_set(v, i) (((v)->counter) = (i))
|
||||
|
||||
#include <linux/irqflags.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
/**
|
||||
* atomic_add_return - add integer to atomic variable
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/* Generic barrier definitions, based on MN10300 definitions.
|
||||
*
|
||||
* It should be possible to use these on really simple architectures,
|
||||
* but it serves more as a starting point for new ports.
|
||||
*
|
||||
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
#ifndef __ASM_GENERIC_BARRIER_H
|
||||
#define __ASM_GENERIC_BARRIER_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define nop() asm volatile ("nop")
|
||||
|
||||
/*
|
||||
* Force strict CPU ordering.
|
||||
* And yes, this is required on UP too when we're talking
|
||||
* to devices.
|
||||
*
|
||||
* This implementation only contains a compiler barrier.
|
||||
*/
|
||||
|
||||
#define mb() asm volatile ("": : :"memory")
|
||||
#define rmb() mb()
|
||||
#define wmb() asm volatile ("": : :"memory")
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define smp_mb() mb()
|
||||
#define smp_rmb() rmb()
|
||||
#define smp_wmb() wmb()
|
||||
#else
|
||||
#define smp_mb() barrier()
|
||||
#define smp_rmb() barrier()
|
||||
#define smp_wmb() barrier()
|
||||
#endif
|
||||
|
||||
#define set_mb(var, value) do { var = value; mb(); } while (0)
|
||||
#define set_wmb(var, value) do { var = value; wmb(); } while (0)
|
||||
|
||||
#define read_barrier_depends() do {} while (0)
|
||||
#define smp_read_barrier_depends() do {} while (0)
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
#endif /* __ASM_GENERIC_BARRIER_H */
|
||||
@@ -2,7 +2,7 @@
|
||||
#define _ASM_GENERIC_BITOPS_ATOMIC_H_
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/irqflags.h>
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#include <asm/spinlock.h>
|
||||
|
||||
@@ -1,22 +1,98 @@
|
||||
/*
|
||||
* Generic UP xchg and cmpxchg using interrupt disablement. Does not
|
||||
* support SMP.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_GENERIC_CMPXCHG_H
|
||||
#define __ASM_GENERIC_CMPXCHG_H
|
||||
|
||||
/*
|
||||
* Generic cmpxchg
|
||||
*
|
||||
* Uses the local cmpxchg. Does not support SMP.
|
||||
*/
|
||||
#ifdef CONFIG_SMP
|
||||
#error "Cannot use generic cmpxchg on SMP"
|
||||
#endif
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/irqflags.h>
|
||||
|
||||
#ifndef xchg
|
||||
|
||||
/*
|
||||
* This function doesn't exist, so you'll get a linker error if
|
||||
* something tries to do an invalidly-sized xchg().
|
||||
*/
|
||||
extern void __xchg_called_with_bad_pointer(void);
|
||||
|
||||
static inline
|
||||
unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
|
||||
{
|
||||
unsigned long ret, flags;
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
#ifdef __xchg_u8
|
||||
return __xchg_u8(x, ptr);
|
||||
#else
|
||||
local_irq_save(flags);
|
||||
ret = *(volatile u8 *)ptr;
|
||||
*(volatile u8 *)ptr = x;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
#endif /* __xchg_u8 */
|
||||
|
||||
case 2:
|
||||
#ifdef __xchg_u16
|
||||
return __xchg_u16(x, ptr);
|
||||
#else
|
||||
local_irq_save(flags);
|
||||
ret = *(volatile u16 *)ptr;
|
||||
*(volatile u16 *)ptr = x;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
#endif /* __xchg_u16 */
|
||||
|
||||
case 4:
|
||||
#ifdef __xchg_u32
|
||||
return __xchg_u32(x, ptr);
|
||||
#else
|
||||
local_irq_save(flags);
|
||||
ret = *(volatile u32 *)ptr;
|
||||
*(volatile u32 *)ptr = x;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
#endif /* __xchg_u32 */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
case 8:
|
||||
#ifdef __xchg_u64
|
||||
return __xchg_u64(x, ptr);
|
||||
#else
|
||||
local_irq_save(flags);
|
||||
ret = *(volatile u64 *)ptr;
|
||||
*(volatile u64 *)ptr = x;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
#endif /* __xchg_u64 */
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
default:
|
||||
__xchg_called_with_bad_pointer();
|
||||
return x;
|
||||
}
|
||||
}
|
||||
|
||||
#define xchg(ptr, x) \
|
||||
((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
|
||||
|
||||
#endif /* xchg */
|
||||
|
||||
/*
|
||||
* Atomic compare and exchange.
|
||||
*
|
||||
* Do not define __HAVE_ARCH_CMPXCHG because we want to use it to check whether
|
||||
* a cmpxchg primitive faster than repeated local irq save/restore exists.
|
||||
*/
|
||||
#include <asm-generic/cmpxchg-local.h>
|
||||
|
||||
#define cmpxchg(ptr, o, n) cmpxchg_local((ptr), (o), (n))
|
||||
#define cmpxchg64(ptr, o, n) cmpxchg64_local((ptr), (o), (n))
|
||||
|
||||
#endif
|
||||
#endif /* __ASM_GENERIC_CMPXCHG_H */
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/* Generic process execution definitions, based on MN10300 definitions.
|
||||
*
|
||||
* It should be possible to use these on really simple architectures,
|
||||
* but it serves more as a starting point for new ports.
|
||||
*
|
||||
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
#ifndef __ASM_GENERIC_EXEC_H
|
||||
#define __ASM_GENERIC_EXEC_H
|
||||
|
||||
#define arch_align_stack(x) (x)
|
||||
|
||||
#endif /* __ASM_GENERIC_EXEC_H */
|
||||
@@ -142,9 +142,9 @@ extern int __must_check gpiochip_reserve(int start, int ngpio);
|
||||
/* add/remove chips */
|
||||
extern int gpiochip_add(struct gpio_chip *chip);
|
||||
extern int __must_check gpiochip_remove(struct gpio_chip *chip);
|
||||
extern struct gpio_chip *gpiochip_find(void *data,
|
||||
extern struct gpio_chip *gpiochip_find(const void *data,
|
||||
int (*match)(struct gpio_chip *chip,
|
||||
void *data));
|
||||
const void *data));
|
||||
|
||||
|
||||
/* Always use the library code for GPIO management calls,
|
||||
|
||||
@@ -10,8 +10,13 @@
|
||||
* architectures, so that you can override them.
|
||||
*/
|
||||
|
||||
#ifndef __kernel_long_t
|
||||
typedef long __kernel_long_t;
|
||||
typedef unsigned long __kernel_ulong_t;
|
||||
#endif
|
||||
|
||||
#ifndef __kernel_ino_t
|
||||
typedef unsigned long __kernel_ino_t;
|
||||
typedef __kernel_ulong_t __kernel_ino_t;
|
||||
#endif
|
||||
|
||||
#ifndef __kernel_mode_t
|
||||
@@ -19,7 +24,7 @@ typedef unsigned int __kernel_mode_t;
|
||||
#endif
|
||||
|
||||
#ifndef __kernel_nlink_t
|
||||
typedef unsigned long __kernel_nlink_t;
|
||||
typedef __kernel_ulong_t __kernel_nlink_t;
|
||||
#endif
|
||||
|
||||
#ifndef __kernel_pid_t
|
||||
@@ -36,7 +41,7 @@ typedef unsigned int __kernel_gid_t;
|
||||
#endif
|
||||
|
||||
#ifndef __kernel_suseconds_t
|
||||
typedef long __kernel_suseconds_t;
|
||||
typedef __kernel_long_t __kernel_suseconds_t;
|
||||
#endif
|
||||
|
||||
#ifndef __kernel_daddr_t
|
||||
@@ -44,8 +49,8 @@ typedef int __kernel_daddr_t;
|
||||
#endif
|
||||
|
||||
#ifndef __kernel_uid32_t
|
||||
typedef __kernel_uid_t __kernel_uid32_t;
|
||||
typedef __kernel_gid_t __kernel_gid32_t;
|
||||
typedef unsigned int __kernel_uid32_t;
|
||||
typedef unsigned int __kernel_gid32_t;
|
||||
#endif
|
||||
|
||||
#ifndef __kernel_old_uid_t
|
||||
@@ -67,99 +72,29 @@ typedef unsigned int __kernel_size_t;
|
||||
typedef int __kernel_ssize_t;
|
||||
typedef int __kernel_ptrdiff_t;
|
||||
#else
|
||||
typedef unsigned long __kernel_size_t;
|
||||
typedef long __kernel_ssize_t;
|
||||
typedef long __kernel_ptrdiff_t;
|
||||
typedef __kernel_ulong_t __kernel_size_t;
|
||||
typedef __kernel_long_t __kernel_ssize_t;
|
||||
typedef __kernel_long_t __kernel_ptrdiff_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef __kernel_fsid_t
|
||||
typedef struct {
|
||||
int val[2];
|
||||
} __kernel_fsid_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* anything below here should be completely generic
|
||||
*/
|
||||
typedef long __kernel_off_t;
|
||||
typedef __kernel_long_t __kernel_off_t;
|
||||
typedef long long __kernel_loff_t;
|
||||
typedef long __kernel_time_t;
|
||||
typedef long __kernel_clock_t;
|
||||
typedef __kernel_long_t __kernel_time_t;
|
||||
typedef __kernel_long_t __kernel_clock_t;
|
||||
typedef int __kernel_timer_t;
|
||||
typedef int __kernel_clockid_t;
|
||||
typedef char * __kernel_caddr_t;
|
||||
typedef unsigned short __kernel_uid16_t;
|
||||
typedef unsigned short __kernel_gid16_t;
|
||||
|
||||
typedef struct {
|
||||
int val[2];
|
||||
} __kernel_fsid_t;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#undef __FD_SET
|
||||
static inline void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp)
|
||||
{
|
||||
unsigned long __tmp = __fd / __NFDBITS;
|
||||
unsigned long __rem = __fd % __NFDBITS;
|
||||
__fdsetp->fds_bits[__tmp] |= (1UL<<__rem);
|
||||
}
|
||||
|
||||
#undef __FD_CLR
|
||||
static inline void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp)
|
||||
{
|
||||
unsigned long __tmp = __fd / __NFDBITS;
|
||||
unsigned long __rem = __fd % __NFDBITS;
|
||||
__fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem);
|
||||
}
|
||||
|
||||
#undef __FD_ISSET
|
||||
static inline int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p)
|
||||
{
|
||||
unsigned long __tmp = __fd / __NFDBITS;
|
||||
unsigned long __rem = __fd % __NFDBITS;
|
||||
return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This will unroll the loop for the normal constant case (8 ints,
|
||||
* for a 256-bit fd_set)
|
||||
*/
|
||||
#undef __FD_ZERO
|
||||
static inline void __FD_ZERO(__kernel_fd_set *__p)
|
||||
{
|
||||
unsigned long *__tmp = __p->fds_bits;
|
||||
int __i;
|
||||
|
||||
if (__builtin_constant_p(__FDSET_LONGS)) {
|
||||
switch (__FDSET_LONGS) {
|
||||
case 16:
|
||||
__tmp[ 0] = 0; __tmp[ 1] = 0;
|
||||
__tmp[ 2] = 0; __tmp[ 3] = 0;
|
||||
__tmp[ 4] = 0; __tmp[ 5] = 0;
|
||||
__tmp[ 6] = 0; __tmp[ 7] = 0;
|
||||
__tmp[ 8] = 0; __tmp[ 9] = 0;
|
||||
__tmp[10] = 0; __tmp[11] = 0;
|
||||
__tmp[12] = 0; __tmp[13] = 0;
|
||||
__tmp[14] = 0; __tmp[15] = 0;
|
||||
return;
|
||||
|
||||
case 8:
|
||||
__tmp[ 0] = 0; __tmp[ 1] = 0;
|
||||
__tmp[ 2] = 0; __tmp[ 3] = 0;
|
||||
__tmp[ 4] = 0; __tmp[ 5] = 0;
|
||||
__tmp[ 6] = 0; __tmp[ 7] = 0;
|
||||
return;
|
||||
|
||||
case 4:
|
||||
__tmp[ 0] = 0; __tmp[ 1] = 0;
|
||||
__tmp[ 2] = 0; __tmp[ 3] = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
__i = __FDSET_LONGS;
|
||||
while (__i) {
|
||||
__i--;
|
||||
*__tmp = 0;
|
||||
__tmp++;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ASM_GENERIC_POSIX_TYPES_H */
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
/* Generic task switch macro wrapper, based on MN10300 definitions.
|
||||
*
|
||||
* It should be possible to use these on really simple architectures,
|
||||
* but it serves more as a starting point for new ports.
|
||||
*
|
||||
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
#ifndef __ASM_GENERIC_SWITCH_TO_H
|
||||
#define __ASM_GENERIC_SWITCH_TO_H
|
||||
|
||||
#include <linux/thread_info.h>
|
||||
|
||||
/*
|
||||
* Context switching is now performed out-of-line in switch_to.S
|
||||
*/
|
||||
extern struct task_struct *__switch_to(struct task_struct *,
|
||||
struct task_struct *);
|
||||
|
||||
#define switch_to(prev, next, last) \
|
||||
do { \
|
||||
((last) = __switch_to((prev), (next))); \
|
||||
} while (0)
|
||||
|
||||
#endif /* __ASM_GENERIC_SWITCH_TO_H */
|
||||
@@ -1,141 +0,0 @@
|
||||
/* Generic system definitions, based on MN10300 definitions.
|
||||
*
|
||||
* It should be possible to use these on really simple architectures,
|
||||
* but it serves more as a starting point for new ports.
|
||||
*
|
||||
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
#ifndef __ASM_GENERIC_SYSTEM_H
|
||||
#define __ASM_GENERIC_SYSTEM_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/irqflags.h>
|
||||
|
||||
#include <asm/cmpxchg-local.h>
|
||||
#include <asm/cmpxchg.h>
|
||||
|
||||
struct task_struct;
|
||||
|
||||
/* context switching is now performed out-of-line in switch_to.S */
|
||||
extern struct task_struct *__switch_to(struct task_struct *,
|
||||
struct task_struct *);
|
||||
#define switch_to(prev, next, last) \
|
||||
do { \
|
||||
((last) = __switch_to((prev), (next))); \
|
||||
} while (0)
|
||||
|
||||
#define arch_align_stack(x) (x)
|
||||
|
||||
#define nop() asm volatile ("nop")
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
* Force strict CPU ordering.
|
||||
* And yes, this is required on UP too when we're talking
|
||||
* to devices.
|
||||
*
|
||||
* This implementation only contains a compiler barrier.
|
||||
*/
|
||||
|
||||
#define mb() asm volatile ("": : :"memory")
|
||||
#define rmb() mb()
|
||||
#define wmb() asm volatile ("": : :"memory")
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define smp_mb() mb()
|
||||
#define smp_rmb() rmb()
|
||||
#define smp_wmb() wmb()
|
||||
#else
|
||||
#define smp_mb() barrier()
|
||||
#define smp_rmb() barrier()
|
||||
#define smp_wmb() barrier()
|
||||
#endif
|
||||
|
||||
#define set_mb(var, value) do { var = value; mb(); } while (0)
|
||||
#define set_wmb(var, value) do { var = value; wmb(); } while (0)
|
||||
|
||||
#define read_barrier_depends() do {} while (0)
|
||||
#define smp_read_barrier_depends() do {} while (0)
|
||||
|
||||
/*
|
||||
* we make sure local_irq_enable() doesn't cause priority inversion
|
||||
*/
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* This function doesn't exist, so you'll get a linker error
|
||||
* if something tries to do an invalid xchg(). */
|
||||
extern void __xchg_called_with_bad_pointer(void);
|
||||
|
||||
static inline
|
||||
unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
|
||||
{
|
||||
unsigned long ret, flags;
|
||||
|
||||
switch (size) {
|
||||
case 1:
|
||||
#ifdef __xchg_u8
|
||||
return __xchg_u8(x, ptr);
|
||||
#else
|
||||
local_irq_save(flags);
|
||||
ret = *(volatile u8 *)ptr;
|
||||
*(volatile u8 *)ptr = x;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
#endif /* __xchg_u8 */
|
||||
|
||||
case 2:
|
||||
#ifdef __xchg_u16
|
||||
return __xchg_u16(x, ptr);
|
||||
#else
|
||||
local_irq_save(flags);
|
||||
ret = *(volatile u16 *)ptr;
|
||||
*(volatile u16 *)ptr = x;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
#endif /* __xchg_u16 */
|
||||
|
||||
case 4:
|
||||
#ifdef __xchg_u32
|
||||
return __xchg_u32(x, ptr);
|
||||
#else
|
||||
local_irq_save(flags);
|
||||
ret = *(volatile u32 *)ptr;
|
||||
*(volatile u32 *)ptr = x;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
#endif /* __xchg_u32 */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
case 8:
|
||||
#ifdef __xchg_u64
|
||||
return __xchg_u64(x, ptr);
|
||||
#else
|
||||
local_irq_save(flags);
|
||||
ret = *(volatile u64 *)ptr;
|
||||
*(volatile u64 *)ptr = x;
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
#endif /* __xchg_u64 */
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
default:
|
||||
__xchg_called_with_bad_pointer();
|
||||
return x;
|
||||
}
|
||||
}
|
||||
|
||||
#define xchg(ptr, x) \
|
||||
((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_GENERIC_SYSTEM_H */
|
||||
@@ -218,7 +218,7 @@ __SC_COMP(__NR_pwritev, sys_pwritev, compat_sys_pwritev)
|
||||
|
||||
/* fs/sendfile.c */
|
||||
#define __NR3264_sendfile 71
|
||||
__SC_3264(__NR3264_sendfile, sys_sendfile64, sys_sendfile)
|
||||
__SYSCALL(__NR3264_sendfile, sys_sendfile64)
|
||||
|
||||
/* fs/select.c */
|
||||
#define __NR_pselect6 72
|
||||
|
||||
@@ -616,30 +616,23 @@
|
||||
*(.init.setup) \
|
||||
VMLINUX_SYMBOL(__setup_end) = .;
|
||||
|
||||
#define INITCALLS \
|
||||
*(.initcallearly.init) \
|
||||
VMLINUX_SYMBOL(__early_initcall_end) = .; \
|
||||
*(.initcall0.init) \
|
||||
*(.initcall0s.init) \
|
||||
*(.initcall1.init) \
|
||||
*(.initcall1s.init) \
|
||||
*(.initcall2.init) \
|
||||
*(.initcall2s.init) \
|
||||
*(.initcall3.init) \
|
||||
*(.initcall3s.init) \
|
||||
*(.initcall4.init) \
|
||||
*(.initcall4s.init) \
|
||||
*(.initcall5.init) \
|
||||
*(.initcall5s.init) \
|
||||
*(.initcallrootfs.init) \
|
||||
*(.initcall6.init) \
|
||||
*(.initcall6s.init) \
|
||||
*(.initcall7.init) \
|
||||
*(.initcall7s.init)
|
||||
#define INIT_CALLS_LEVEL(level) \
|
||||
VMLINUX_SYMBOL(__initcall##level##_start) = .; \
|
||||
*(.initcall##level##.init) \
|
||||
*(.initcall##level##s.init) \
|
||||
|
||||
#define INIT_CALLS \
|
||||
VMLINUX_SYMBOL(__initcall_start) = .; \
|
||||
INITCALLS \
|
||||
*(.initcallearly.init) \
|
||||
INIT_CALLS_LEVEL(0) \
|
||||
INIT_CALLS_LEVEL(1) \
|
||||
INIT_CALLS_LEVEL(2) \
|
||||
INIT_CALLS_LEVEL(3) \
|
||||
INIT_CALLS_LEVEL(4) \
|
||||
INIT_CALLS_LEVEL(5) \
|
||||
INIT_CALLS_LEVEL(rootfs) \
|
||||
INIT_CALLS_LEVEL(6) \
|
||||
INIT_CALLS_LEVEL(7) \
|
||||
VMLINUX_SYMBOL(__initcall_end) = .;
|
||||
|
||||
#define CON_INITCALL \
|
||||
|
||||
@@ -31,6 +31,8 @@ static inline void crypto_set_aead_spawn(
|
||||
crypto_set_spawn(&spawn->base, inst);
|
||||
}
|
||||
|
||||
struct crypto_alg *crypto_lookup_aead(const char *name, u32 type, u32 mask);
|
||||
|
||||
int crypto_grab_aead(struct crypto_aead_spawn *spawn, const char *name,
|
||||
u32 type, u32 mask);
|
||||
|
||||
|
||||
@@ -34,6 +34,8 @@ static inline void crypto_set_skcipher_spawn(
|
||||
int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name,
|
||||
u32 type, u32 mask);
|
||||
|
||||
struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type, u32 mask);
|
||||
|
||||
static inline void crypto_drop_skcipher(struct crypto_skcipher_spawn *spawn)
|
||||
{
|
||||
crypto_drop_spawn(&spawn->base);
|
||||
|
||||
+13
-1
@@ -617,6 +617,17 @@ struct drm_get_cap {
|
||||
__u64 value;
|
||||
};
|
||||
|
||||
#define DRM_CLOEXEC O_CLOEXEC
|
||||
struct drm_prime_handle {
|
||||
__u32 handle;
|
||||
|
||||
/** Flags.. only applicable for handle->fd */
|
||||
__u32 flags;
|
||||
|
||||
/** Returned dmabuf file descriptor */
|
||||
__s32 fd;
|
||||
};
|
||||
|
||||
#include "drm_mode.h"
|
||||
|
||||
#define DRM_IOCTL_BASE 'd'
|
||||
@@ -673,7 +684,8 @@ struct drm_get_cap {
|
||||
#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, struct drm_lock)
|
||||
#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, struct drm_lock)
|
||||
|
||||
#define DRM_IOCTL_GEM_PRIME_OPEN DRM_IOWR(0x2e, struct drm_gem_open)
|
||||
#define DRM_IOCTL_PRIME_HANDLE_TO_FD DRM_IOWR(0x2d, struct drm_prime_handle)
|
||||
#define DRM_IOCTL_PRIME_FD_TO_HANDLE DRM_IOWR(0x2e, struct drm_prime_handle)
|
||||
|
||||
#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
|
||||
#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
|
||||
|
||||
@@ -91,6 +91,7 @@ struct drm_device;
|
||||
#define DRM_UT_CORE 0x01
|
||||
#define DRM_UT_DRIVER 0x02
|
||||
#define DRM_UT_KMS 0x04
|
||||
#define DRM_UT_PRIME 0x08
|
||||
/*
|
||||
* Three debug levels are defined.
|
||||
* drm_core, drm_driver, drm_kms
|
||||
@@ -150,6 +151,7 @@ int drm_err(const char *func, const char *format, ...);
|
||||
#define DRIVER_IRQ_VBL2 0x800
|
||||
#define DRIVER_GEM 0x1000
|
||||
#define DRIVER_MODESET 0x2000
|
||||
#define DRIVER_PRIME 0x4000
|
||||
|
||||
#define DRIVER_BUS_PCI 0x1
|
||||
#define DRIVER_BUS_PLATFORM 0x2
|
||||
@@ -215,6 +217,11 @@ int drm_err(const char *func, const char *format, ...);
|
||||
drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME, \
|
||||
__func__, fmt, ##args); \
|
||||
} while (0)
|
||||
#define DRM_DEBUG_PRIME(fmt, args...) \
|
||||
do { \
|
||||
drm_ut_debug_printk(DRM_UT_PRIME, DRM_NAME, \
|
||||
__func__, fmt, ##args); \
|
||||
} while (0)
|
||||
#define DRM_LOG(fmt, args...) \
|
||||
do { \
|
||||
drm_ut_debug_printk(DRM_UT_CORE, NULL, \
|
||||
@@ -238,6 +245,7 @@ int drm_err(const char *func, const char *format, ...);
|
||||
#else
|
||||
#define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0)
|
||||
#define DRM_DEBUG_KMS(fmt, args...) do { } while (0)
|
||||
#define DRM_DEBUG_PRIME(fmt, args...) do { } while (0)
|
||||
#define DRM_DEBUG(fmt, arg...) do { } while (0)
|
||||
#define DRM_LOG(fmt, arg...) do { } while (0)
|
||||
#define DRM_LOG_KMS(fmt, args...) do { } while (0)
|
||||
@@ -410,6 +418,12 @@ struct drm_pending_event {
|
||||
void (*destroy)(struct drm_pending_event *event);
|
||||
};
|
||||
|
||||
/* initial implementaton using a linked list - todo hashtab */
|
||||
struct drm_prime_file_private {
|
||||
struct list_head head;
|
||||
struct mutex lock;
|
||||
};
|
||||
|
||||
/** File private data */
|
||||
struct drm_file {
|
||||
int authenticated;
|
||||
@@ -437,6 +451,8 @@ struct drm_file {
|
||||
wait_queue_head_t event_wait;
|
||||
struct list_head event_list;
|
||||
int event_space;
|
||||
|
||||
struct drm_prime_file_private prime;
|
||||
};
|
||||
|
||||
/** Wait queue */
|
||||
@@ -652,6 +668,12 @@ struct drm_gem_object {
|
||||
uint32_t pending_write_domain;
|
||||
|
||||
void *driver_private;
|
||||
|
||||
/* dma buf exported from this GEM object */
|
||||
struct dma_buf *export_dma_buf;
|
||||
|
||||
/* dma buf attachment backing this object */
|
||||
struct dma_buf_attachment *import_attach;
|
||||
};
|
||||
|
||||
#include "drm_crtc.h"
|
||||
@@ -890,6 +912,20 @@ struct drm_driver {
|
||||
int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
|
||||
void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
|
||||
|
||||
/* prime: */
|
||||
/* export handle -> fd (see drm_gem_prime_handle_to_fd() helper) */
|
||||
int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv,
|
||||
uint32_t handle, uint32_t flags, int *prime_fd);
|
||||
/* import fd -> handle (see drm_gem_prime_fd_to_handle() helper) */
|
||||
int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv,
|
||||
int prime_fd, uint32_t *handle);
|
||||
/* export GEM -> dmabuf */
|
||||
struct dma_buf * (*gem_prime_export)(struct drm_device *dev,
|
||||
struct drm_gem_object *obj, int flags);
|
||||
/* import dmabuf -> GEM */
|
||||
struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,
|
||||
struct dma_buf *dma_buf);
|
||||
|
||||
/* vga arb irq handler */
|
||||
void (*vgaarb_irq)(struct drm_device *dev, bool state);
|
||||
|
||||
@@ -1509,6 +1545,32 @@ extern int drm_vblank_info(struct seq_file *m, void *data);
|
||||
extern int drm_clients_info(struct seq_file *m, void* data);
|
||||
extern int drm_gem_name_info(struct seq_file *m, void *data);
|
||||
|
||||
|
||||
extern int drm_gem_prime_handle_to_fd(struct drm_device *dev,
|
||||
struct drm_file *file_priv, uint32_t handle, uint32_t flags,
|
||||
int *prime_fd);
|
||||
extern int drm_gem_prime_fd_to_handle(struct drm_device *dev,
|
||||
struct drm_file *file_priv, int prime_fd, uint32_t *handle);
|
||||
|
||||
extern int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
|
||||
extern struct sg_table *drm_prime_pages_to_sg(struct page **pages, int nr_pages);
|
||||
extern void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg);
|
||||
|
||||
|
||||
void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv);
|
||||
void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv);
|
||||
int drm_prime_add_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t handle);
|
||||
int drm_prime_lookup_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf, uint32_t *handle);
|
||||
void drm_prime_remove_imported_buf_handle(struct drm_prime_file_private *prime_fpriv, struct dma_buf *dma_buf);
|
||||
|
||||
int drm_prime_add_dma_buf(struct drm_device *dev, struct drm_gem_object *obj);
|
||||
int drm_prime_lookup_obj(struct drm_device *dev, struct dma_buf *buf,
|
||||
struct drm_gem_object **obj);
|
||||
|
||||
#if DRM_DEBUG_CODE
|
||||
extern int drm_vma_info(struct seq_file *m, void *data);
|
||||
#endif
|
||||
|
||||
@@ -44,4 +44,8 @@ void intel_gtt_insert_pages(unsigned int first_entry, unsigned int num_entries,
|
||||
/* flag for GFDT type */
|
||||
#define AGP_USER_CACHED_MEMORY_GFDT (1 << 3)
|
||||
|
||||
#ifdef CONFIG_INTEL_IOMMU
|
||||
extern int intel_iommu_gfx_mapped;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,6 +3,7 @@ header-y += can/
|
||||
header-y += caif/
|
||||
header-y += dvb/
|
||||
header-y += hdlc/
|
||||
header-y += hsi/
|
||||
header-y += isdn/
|
||||
header-y += mmc/
|
||||
header-y += nfsd/
|
||||
@@ -120,7 +121,6 @@ header-y += errno.h
|
||||
header-y += errqueue.h
|
||||
header-y += ethtool.h
|
||||
header-y += eventpoll.h
|
||||
header-y += ext2_fs.h
|
||||
header-y += fadvise.h
|
||||
header-y += falloc.h
|
||||
header-y += fanotify.h
|
||||
@@ -357,6 +357,7 @@ header-y += suspend_ioctls.h
|
||||
header-y += swab.h
|
||||
header-y += synclink.h
|
||||
header-y += sysctl.h
|
||||
header-y += sysinfo.h
|
||||
header-y += taskstats.h
|
||||
header-y += tcp.h
|
||||
header-y += telephony.h
|
||||
|
||||
@@ -151,6 +151,7 @@ extern int ec_write(u8 addr, u8 val);
|
||||
extern int ec_transaction(u8 command,
|
||||
const u8 *wdata, unsigned wdata_len,
|
||||
u8 *rdata, unsigned rdata_len);
|
||||
extern acpi_handle ec_get_handle(void);
|
||||
|
||||
#if defined(CONFIG_ACPI_WMI) || defined(CONFIG_ACPI_WMI_MODULE)
|
||||
|
||||
@@ -371,4 +372,14 @@ static inline int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),
|
||||
|
||||
#endif /* !CONFIG_ACPI */
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state,
|
||||
u32 pm1a_ctrl, u32 pm1b_ctrl));
|
||||
|
||||
acpi_status acpi_os_prepare_sleep(u8 sleep_state,
|
||||
u32 pm1a_control, u32 pm1b_control);
|
||||
#else
|
||||
#define acpi_os_set_prepare_sleep(func, pm1a_ctrl, pm1b_ctrl) do { } while (0)
|
||||
#endif
|
||||
|
||||
#endif /*_LINUX_ACPI_H*/
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
typedef unsigned long aio_context_t;
|
||||
typedef __kernel_ulong_t aio_context_t;
|
||||
|
||||
enum {
|
||||
IOCB_CMD_PREAD = 0,
|
||||
|
||||
@@ -47,9 +47,6 @@ enum {
|
||||
* @muxval: a number usually used to poke into some mux regiser to
|
||||
* mux in the signal to this channel
|
||||
* @cctl_opt: default options for the channel control register
|
||||
* @device_fc: Flow Controller Settings for ccfg register. Only valid for slave
|
||||
* channels. Fill with 'true' if peripheral should be flow controller. Direction
|
||||
* will be selected at Runtime.
|
||||
* @addr: source/target address in physical memory for this DMA channel,
|
||||
* can be the address of a FIFO register for burst requests for example.
|
||||
* This can be left undefined if the PrimeCell API is used for configuring
|
||||
@@ -68,7 +65,6 @@ struct pl08x_channel_data {
|
||||
int max_signal;
|
||||
u32 muxval;
|
||||
u32 cctl;
|
||||
bool device_fc;
|
||||
dma_addr_t addr;
|
||||
bool circular_buffer;
|
||||
bool single;
|
||||
@@ -176,13 +172,15 @@ enum pl08x_dma_chan_state {
|
||||
* @runtime_addr: address for RX/TX according to the runtime config
|
||||
* @runtime_direction: current direction of this channel according to
|
||||
* runtime config
|
||||
* @lc: last completed transaction on this channel
|
||||
* @pend_list: queued transactions pending on this channel
|
||||
* @at: active transaction on this channel
|
||||
* @lock: a lock for this channel data
|
||||
* @host: a pointer to the host (internal use)
|
||||
* @state: whether the channel is idle, paused, running etc
|
||||
* @slave: whether this channel is a device (slave) or for memcpy
|
||||
* @device_fc: Flow Controller Settings for ccfg register. Only valid for slave
|
||||
* channels. Fill with 'true' if peripheral should be flow controller. Direction
|
||||
* will be selected at Runtime.
|
||||
* @waiting: a TX descriptor on this channel which is waiting for a physical
|
||||
* channel to become available
|
||||
*/
|
||||
@@ -198,13 +196,13 @@ struct pl08x_dma_chan {
|
||||
u32 src_cctl;
|
||||
u32 dst_cctl;
|
||||
enum dma_transfer_direction runtime_direction;
|
||||
dma_cookie_t lc;
|
||||
struct list_head pend_list;
|
||||
struct pl08x_txd *at;
|
||||
spinlock_t lock;
|
||||
struct pl08x_driver_data *host;
|
||||
enum pl08x_dma_chan_state state;
|
||||
bool slave;
|
||||
bool device_fc;
|
||||
struct pl08x_txd *waiting;
|
||||
};
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#define __AMBA_PL330_H_
|
||||
|
||||
#include <linux/dmaengine.h>
|
||||
#include <asm/hardware/pl330.h>
|
||||
|
||||
struct dma_pl330_platdata {
|
||||
/*
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* apple_bl exported symbols
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_APPLE_BL_H
|
||||
#define _LINUX_APPLE_BL_H
|
||||
|
||||
#ifdef CONFIG_BACKLIGHT_APPLE
|
||||
|
||||
extern int apple_bl_register(void);
|
||||
extern void apple_bl_unregister(void);
|
||||
|
||||
#else /* !CONFIG_BACKLIGHT_APPLE */
|
||||
|
||||
static inline int apple_bl_register(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void apple_bl_unregister(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_BACKLIGHT_APPLE */
|
||||
|
||||
#endif /* _LINUX_APPLE_BL_H */
|
||||
@@ -208,7 +208,7 @@ extern struct kmem_cache *ceph_cap_cachep;
|
||||
extern struct kmem_cache *ceph_dentry_cachep;
|
||||
extern struct kmem_cache *ceph_file_cachep;
|
||||
|
||||
extern int ceph_parse_options(struct ceph_options **popt, char *options,
|
||||
extern struct ceph_options *ceph_parse_options(char *options,
|
||||
const char *dev_name, const char *dev_name_end,
|
||||
int (*parse_extra_token)(char *c, void *private),
|
||||
void *private);
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
struct ceph_msg;
|
||||
struct ceph_connection;
|
||||
|
||||
extern struct workqueue_struct *ceph_msgr_wq; /* receive work queue */
|
||||
|
||||
/*
|
||||
* Ceph defines these callbacks for handling connection events.
|
||||
*/
|
||||
@@ -54,7 +52,6 @@ struct ceph_connection_operations {
|
||||
struct ceph_messenger {
|
||||
struct ceph_entity_inst inst; /* my name+address */
|
||||
struct ceph_entity_addr my_enc_addr;
|
||||
struct page *zero_page; /* used in certain error cases */
|
||||
|
||||
bool nocrc;
|
||||
|
||||
@@ -101,7 +98,7 @@ struct ceph_msg {
|
||||
struct ceph_msg_pos {
|
||||
int page, page_pos; /* which page; offset in page */
|
||||
int data_pos; /* offset in data payload */
|
||||
int did_page_crc; /* true if we've calculated crc for current page */
|
||||
bool did_page_crc; /* true if we've calculated crc for current page */
|
||||
};
|
||||
|
||||
/* ceph connection fault delay defaults, for exponential backoff */
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
* linux/include/linux/clk-private.h
|
||||
*
|
||||
* Copyright (c) 2010-2011 Jeremy Kerr <jeremy.kerr@canonical.com>
|
||||
* Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef __LINUX_CLK_PRIVATE_H
|
||||
#define __LINUX_CLK_PRIVATE_H
|
||||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
/*
|
||||
* WARNING: Do not include clk-private.h from any file that implements struct
|
||||
* clk_ops. Doing so is a layering violation!
|
||||
*
|
||||
* This header exists only to allow for statically initialized clock data. Any
|
||||
* static clock data must be defined in a separate file from the logic that
|
||||
* implements the clock operations for that same data.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_COMMON_CLK
|
||||
|
||||
struct clk {
|
||||
const char *name;
|
||||
const struct clk_ops *ops;
|
||||
struct clk_hw *hw;
|
||||
struct clk *parent;
|
||||
char **parent_names;
|
||||
struct clk **parents;
|
||||
u8 num_parents;
|
||||
unsigned long rate;
|
||||
unsigned long new_rate;
|
||||
unsigned long flags;
|
||||
unsigned int enable_count;
|
||||
unsigned int prepare_count;
|
||||
struct hlist_head children;
|
||||
struct hlist_node child_node;
|
||||
unsigned int notifier_count;
|
||||
#ifdef CONFIG_COMMON_CLK_DEBUG
|
||||
struct dentry *dentry;
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* DOC: Basic clock implementations common to many platforms
|
||||
*
|
||||
* Each basic clock hardware type is comprised of a structure describing the
|
||||
* clock hardware, implementations of the relevant callbacks in struct clk_ops,
|
||||
* unique flags for that hardware type, a registration function and an
|
||||
* alternative macro for static initialization
|
||||
*/
|
||||
|
||||
extern struct clk_ops clk_fixed_rate_ops;
|
||||
|
||||
#define DEFINE_CLK_FIXED_RATE(_name, _flags, _rate, \
|
||||
_fixed_rate_flags) \
|
||||
static struct clk _name; \
|
||||
static char *_name##_parent_names[] = {}; \
|
||||
static struct clk_fixed_rate _name##_hw = { \
|
||||
.hw = { \
|
||||
.clk = &_name, \
|
||||
}, \
|
||||
.fixed_rate = _rate, \
|
||||
.flags = _fixed_rate_flags, \
|
||||
}; \
|
||||
static struct clk _name = { \
|
||||
.name = #_name, \
|
||||
.ops = &clk_fixed_rate_ops, \
|
||||
.hw = &_name##_hw.hw, \
|
||||
.parent_names = _name##_parent_names, \
|
||||
.num_parents = \
|
||||
ARRAY_SIZE(_name##_parent_names), \
|
||||
.flags = _flags, \
|
||||
};
|
||||
|
||||
extern struct clk_ops clk_gate_ops;
|
||||
|
||||
#define DEFINE_CLK_GATE(_name, _parent_name, _parent_ptr, \
|
||||
_flags, _reg, _bit_idx, \
|
||||
_gate_flags, _lock) \
|
||||
static struct clk _name; \
|
||||
static char *_name##_parent_names[] = { \
|
||||
_parent_name, \
|
||||
}; \
|
||||
static struct clk *_name##_parents[] = { \
|
||||
_parent_ptr, \
|
||||
}; \
|
||||
static struct clk_gate _name##_hw = { \
|
||||
.hw = { \
|
||||
.clk = &_name, \
|
||||
}, \
|
||||
.reg = _reg, \
|
||||
.bit_idx = _bit_idx, \
|
||||
.flags = _gate_flags, \
|
||||
.lock = _lock, \
|
||||
}; \
|
||||
static struct clk _name = { \
|
||||
.name = #_name, \
|
||||
.ops = &clk_gate_ops, \
|
||||
.hw = &_name##_hw.hw, \
|
||||
.parent_names = _name##_parent_names, \
|
||||
.num_parents = \
|
||||
ARRAY_SIZE(_name##_parent_names), \
|
||||
.parents = _name##_parents, \
|
||||
.flags = _flags, \
|
||||
};
|
||||
|
||||
extern struct clk_ops clk_divider_ops;
|
||||
|
||||
#define DEFINE_CLK_DIVIDER(_name, _parent_name, _parent_ptr, \
|
||||
_flags, _reg, _shift, _width, \
|
||||
_divider_flags, _lock) \
|
||||
static struct clk _name; \
|
||||
static char *_name##_parent_names[] = { \
|
||||
_parent_name, \
|
||||
}; \
|
||||
static struct clk *_name##_parents[] = { \
|
||||
_parent_ptr, \
|
||||
}; \
|
||||
static struct clk_divider _name##_hw = { \
|
||||
.hw = { \
|
||||
.clk = &_name, \
|
||||
}, \
|
||||
.reg = _reg, \
|
||||
.shift = _shift, \
|
||||
.width = _width, \
|
||||
.flags = _divider_flags, \
|
||||
.lock = _lock, \
|
||||
}; \
|
||||
static struct clk _name = { \
|
||||
.name = #_name, \
|
||||
.ops = &clk_divider_ops, \
|
||||
.hw = &_name##_hw.hw, \
|
||||
.parent_names = _name##_parent_names, \
|
||||
.num_parents = \
|
||||
ARRAY_SIZE(_name##_parent_names), \
|
||||
.parents = _name##_parents, \
|
||||
.flags = _flags, \
|
||||
};
|
||||
|
||||
extern struct clk_ops clk_mux_ops;
|
||||
|
||||
#define DEFINE_CLK_MUX(_name, _parent_names, _parents, _flags, \
|
||||
_reg, _shift, _width, \
|
||||
_mux_flags, _lock) \
|
||||
static struct clk _name; \
|
||||
static struct clk_mux _name##_hw = { \
|
||||
.hw = { \
|
||||
.clk = &_name, \
|
||||
}, \
|
||||
.reg = _reg, \
|
||||
.shift = _shift, \
|
||||
.width = _width, \
|
||||
.flags = _mux_flags, \
|
||||
.lock = _lock, \
|
||||
}; \
|
||||
static struct clk _name = { \
|
||||
.name = #_name, \
|
||||
.ops = &clk_mux_ops, \
|
||||
.hw = &_name##_hw.hw, \
|
||||
.parent_names = _parent_names, \
|
||||
.num_parents = \
|
||||
ARRAY_SIZE(_parent_names), \
|
||||
.parents = _parents, \
|
||||
.flags = _flags, \
|
||||
};
|
||||
|
||||
/**
|
||||
* __clk_init - initialize the data structures in a struct clk
|
||||
* @dev: device initializing this clk, placeholder for now
|
||||
* @clk: clk being initialized
|
||||
*
|
||||
* Initializes the lists in struct clk, queries the hardware for the
|
||||
* parent and rate and sets them both.
|
||||
*
|
||||
* Any struct clk passed into __clk_init must have the following members
|
||||
* populated:
|
||||
* .name
|
||||
* .ops
|
||||
* .hw
|
||||
* .parent_names
|
||||
* .num_parents
|
||||
* .flags
|
||||
*
|
||||
* It is not necessary to call clk_register if __clk_init is used directly with
|
||||
* statically initialized clock data.
|
||||
*/
|
||||
void __clk_init(struct device *dev, struct clk *clk);
|
||||
|
||||
#endif /* CONFIG_COMMON_CLK */
|
||||
#endif /* CLK_PRIVATE_H */
|
||||
@@ -0,0 +1,300 @@
|
||||
/*
|
||||
* linux/include/linux/clk-provider.h
|
||||
*
|
||||
* Copyright (c) 2010-2011 Jeremy Kerr <jeremy.kerr@canonical.com>
|
||||
* Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#ifndef __LINUX_CLK_PROVIDER_H
|
||||
#define __LINUX_CLK_PROVIDER_H
|
||||
|
||||
#include <linux/clk.h>
|
||||
|
||||
#ifdef CONFIG_COMMON_CLK
|
||||
|
||||
/**
|
||||
* struct clk_hw - handle for traversing from a struct clk to its corresponding
|
||||
* hardware-specific structure. struct clk_hw should be declared within struct
|
||||
* clk_foo and then referenced by the struct clk instance that uses struct
|
||||
* clk_foo's clk_ops
|
||||
*
|
||||
* clk: pointer to the struct clk instance that points back to this struct
|
||||
* clk_hw instance
|
||||
*/
|
||||
struct clk_hw {
|
||||
struct clk *clk;
|
||||
};
|
||||
|
||||
/*
|
||||
* flags used across common struct clk. these flags should only affect the
|
||||
* top-level framework. custom flags for dealing with hardware specifics
|
||||
* belong in struct clk_foo
|
||||
*/
|
||||
#define CLK_SET_RATE_GATE BIT(0) /* must be gated across rate change */
|
||||
#define CLK_SET_PARENT_GATE BIT(1) /* must be gated across re-parent */
|
||||
#define CLK_SET_RATE_PARENT BIT(2) /* propagate rate change up one level */
|
||||
#define CLK_IGNORE_UNUSED BIT(3) /* do not gate even if unused */
|
||||
#define CLK_IS_ROOT BIT(4) /* root clk, has no parent */
|
||||
|
||||
/**
|
||||
* struct clk_ops - Callback operations for hardware clocks; these are to
|
||||
* be provided by the clock implementation, and will be called by drivers
|
||||
* through the clk_* api.
|
||||
*
|
||||
* @prepare: Prepare the clock for enabling. This must not return until
|
||||
* the clock is fully prepared, and it's safe to call clk_enable.
|
||||
* This callback is intended to allow clock implementations to
|
||||
* do any initialisation that may sleep. Called with
|
||||
* prepare_lock held.
|
||||
*
|
||||
* @unprepare: Release the clock from its prepared state. This will typically
|
||||
* undo any work done in the @prepare callback. Called with
|
||||
* prepare_lock held.
|
||||
*
|
||||
* @enable: Enable the clock atomically. This must not return until the
|
||||
* clock is generating a valid clock signal, usable by consumer
|
||||
* devices. Called with enable_lock held. This function must not
|
||||
* sleep.
|
||||
*
|
||||
* @disable: Disable the clock atomically. Called with enable_lock held.
|
||||
* This function must not sleep.
|
||||
*
|
||||
* @recalc_rate Recalculate the rate of this clock, by quering hardware. The
|
||||
* parent rate is an input parameter. It is up to the caller to
|
||||
* insure that the prepare_mutex is held across this call.
|
||||
* Returns the calculated rate. Optional, but recommended - if
|
||||
* this op is not set then clock rate will be initialized to 0.
|
||||
*
|
||||
* @round_rate: Given a target rate as input, returns the closest rate actually
|
||||
* supported by the clock.
|
||||
*
|
||||
* @get_parent: Queries the hardware to determine the parent of a clock. The
|
||||
* return value is a u8 which specifies the index corresponding to
|
||||
* the parent clock. This index can be applied to either the
|
||||
* .parent_names or .parents arrays. In short, this function
|
||||
* translates the parent value read from hardware into an array
|
||||
* index. Currently only called when the clock is initialized by
|
||||
* __clk_init. This callback is mandatory for clocks with
|
||||
* multiple parents. It is optional (and unnecessary) for clocks
|
||||
* with 0 or 1 parents.
|
||||
*
|
||||
* @set_parent: Change the input source of this clock; for clocks with multiple
|
||||
* possible parents specify a new parent by passing in the index
|
||||
* as a u8 corresponding to the parent in either the .parent_names
|
||||
* or .parents arrays. This function in affect translates an
|
||||
* array index into the value programmed into the hardware.
|
||||
* Returns 0 on success, -EERROR otherwise.
|
||||
*
|
||||
* @set_rate: Change the rate of this clock. If this callback returns
|
||||
* CLK_SET_RATE_PARENT, the rate change will be propagated to the
|
||||
* parent clock (which may propagate again if the parent clock
|
||||
* also sets this flag). The requested rate of the parent is
|
||||
* passed back from the callback in the second 'unsigned long *'
|
||||
* argument. Note that it is up to the hardware clock's set_rate
|
||||
* implementation to insure that clocks do not run out of spec
|
||||
* when propgating the call to set_rate up to the parent. One way
|
||||
* to do this is to gate the clock (via clk_disable and/or
|
||||
* clk_unprepare) before calling clk_set_rate, then ungating it
|
||||
* afterward. If your clock also has the CLK_GATE_SET_RATE flag
|
||||
* set then this will insure safety. Returns 0 on success,
|
||||
* -EERROR otherwise.
|
||||
*
|
||||
* The clk_enable/clk_disable and clk_prepare/clk_unprepare pairs allow
|
||||
* implementations to split any work between atomic (enable) and sleepable
|
||||
* (prepare) contexts. If enabling a clock requires code that might sleep,
|
||||
* this must be done in clk_prepare. Clock enable code that will never be
|
||||
* called in a sleepable context may be implement in clk_enable.
|
||||
*
|
||||
* Typically, drivers will call clk_prepare when a clock may be needed later
|
||||
* (eg. when a device is opened), and clk_enable when the clock is actually
|
||||
* required (eg. from an interrupt). Note that clk_prepare MUST have been
|
||||
* called before clk_enable.
|
||||
*/
|
||||
struct clk_ops {
|
||||
int (*prepare)(struct clk_hw *hw);
|
||||
void (*unprepare)(struct clk_hw *hw);
|
||||
int (*enable)(struct clk_hw *hw);
|
||||
void (*disable)(struct clk_hw *hw);
|
||||
int (*is_enabled)(struct clk_hw *hw);
|
||||
unsigned long (*recalc_rate)(struct clk_hw *hw,
|
||||
unsigned long parent_rate);
|
||||
long (*round_rate)(struct clk_hw *hw, unsigned long,
|
||||
unsigned long *);
|
||||
int (*set_parent)(struct clk_hw *hw, u8 index);
|
||||
u8 (*get_parent)(struct clk_hw *hw);
|
||||
int (*set_rate)(struct clk_hw *hw, unsigned long);
|
||||
void (*init)(struct clk_hw *hw);
|
||||
};
|
||||
|
||||
/*
|
||||
* DOC: Basic clock implementations common to many platforms
|
||||
*
|
||||
* Each basic clock hardware type is comprised of a structure describing the
|
||||
* clock hardware, implementations of the relevant callbacks in struct clk_ops,
|
||||
* unique flags for that hardware type, a registration function and an
|
||||
* alternative macro for static initialization
|
||||
*/
|
||||
|
||||
/**
|
||||
* struct clk_fixed_rate - fixed-rate clock
|
||||
* @hw: handle between common and hardware-specific interfaces
|
||||
* @fixed_rate: constant frequency of clock
|
||||
*/
|
||||
struct clk_fixed_rate {
|
||||
struct clk_hw hw;
|
||||
unsigned long fixed_rate;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
struct clk *clk_register_fixed_rate(struct device *dev, const char *name,
|
||||
const char *parent_name, unsigned long flags,
|
||||
unsigned long fixed_rate);
|
||||
|
||||
/**
|
||||
* struct clk_gate - gating clock
|
||||
*
|
||||
* @hw: handle between common and hardware-specific interfaces
|
||||
* @reg: register controlling gate
|
||||
* @bit_idx: single bit controlling gate
|
||||
* @flags: hardware-specific flags
|
||||
* @lock: register lock
|
||||
*
|
||||
* Clock which can gate its output. Implements .enable & .disable
|
||||
*
|
||||
* Flags:
|
||||
* CLK_GATE_SET_DISABLE - by default this clock sets the bit at bit_idx to
|
||||
* enable the clock. Setting this flag does the opposite: setting the bit
|
||||
* disable the clock and clearing it enables the clock
|
||||
*/
|
||||
struct clk_gate {
|
||||
struct clk_hw hw;
|
||||
void __iomem *reg;
|
||||
u8 bit_idx;
|
||||
u8 flags;
|
||||
spinlock_t *lock;
|
||||
char *parent[1];
|
||||
};
|
||||
|
||||
#define CLK_GATE_SET_TO_DISABLE BIT(0)
|
||||
|
||||
struct clk *clk_register_gate(struct device *dev, const char *name,
|
||||
const char *parent_name, unsigned long flags,
|
||||
void __iomem *reg, u8 bit_idx,
|
||||
u8 clk_gate_flags, spinlock_t *lock);
|
||||
|
||||
/**
|
||||
* struct clk_divider - adjustable divider clock
|
||||
*
|
||||
* @hw: handle between common and hardware-specific interfaces
|
||||
* @reg: register containing the divider
|
||||
* @shift: shift to the divider bit field
|
||||
* @width: width of the divider bit field
|
||||
* @lock: register lock
|
||||
*
|
||||
* Clock with an adjustable divider affecting its output frequency. Implements
|
||||
* .recalc_rate, .set_rate and .round_rate
|
||||
*
|
||||
* Flags:
|
||||
* CLK_DIVIDER_ONE_BASED - by default the divisor is the value read from the
|
||||
* register plus one. If CLK_DIVIDER_ONE_BASED is set then the divider is
|
||||
* the raw value read from the register, with the value of zero considered
|
||||
* invalid
|
||||
* CLK_DIVIDER_POWER_OF_TWO - clock divisor is 2 raised to the value read from
|
||||
* the hardware register
|
||||
*/
|
||||
struct clk_divider {
|
||||
struct clk_hw hw;
|
||||
void __iomem *reg;
|
||||
u8 shift;
|
||||
u8 width;
|
||||
u8 flags;
|
||||
spinlock_t *lock;
|
||||
char *parent[1];
|
||||
};
|
||||
|
||||
#define CLK_DIVIDER_ONE_BASED BIT(0)
|
||||
#define CLK_DIVIDER_POWER_OF_TWO BIT(1)
|
||||
|
||||
struct clk *clk_register_divider(struct device *dev, const char *name,
|
||||
const char *parent_name, unsigned long flags,
|
||||
void __iomem *reg, u8 shift, u8 width,
|
||||
u8 clk_divider_flags, spinlock_t *lock);
|
||||
|
||||
/**
|
||||
* struct clk_mux - multiplexer clock
|
||||
*
|
||||
* @hw: handle between common and hardware-specific interfaces
|
||||
* @reg: register controlling multiplexer
|
||||
* @shift: shift to multiplexer bit field
|
||||
* @width: width of mutliplexer bit field
|
||||
* @num_clks: number of parent clocks
|
||||
* @lock: register lock
|
||||
*
|
||||
* Clock with multiple selectable parents. Implements .get_parent, .set_parent
|
||||
* and .recalc_rate
|
||||
*
|
||||
* Flags:
|
||||
* CLK_MUX_INDEX_ONE - register index starts at 1, not 0
|
||||
* CLK_MUX_INDEX_BITWISE - register index is a single bit (power of two)
|
||||
*/
|
||||
struct clk_mux {
|
||||
struct clk_hw hw;
|
||||
void __iomem *reg;
|
||||
u8 shift;
|
||||
u8 width;
|
||||
u8 flags;
|
||||
spinlock_t *lock;
|
||||
};
|
||||
|
||||
#define CLK_MUX_INDEX_ONE BIT(0)
|
||||
#define CLK_MUX_INDEX_BIT BIT(1)
|
||||
|
||||
struct clk *clk_register_mux(struct device *dev, const char *name,
|
||||
char **parent_names, u8 num_parents, unsigned long flags,
|
||||
void __iomem *reg, u8 shift, u8 width,
|
||||
u8 clk_mux_flags, spinlock_t *lock);
|
||||
|
||||
/**
|
||||
* clk_register - allocate a new clock, register it and return an opaque cookie
|
||||
* @dev: device that is registering this clock
|
||||
* @name: clock name
|
||||
* @ops: operations this clock supports
|
||||
* @hw: link to hardware-specific clock data
|
||||
* @parent_names: array of string names for all possible parents
|
||||
* @num_parents: number of possible parents
|
||||
* @flags: framework-level hints and quirks
|
||||
*
|
||||
* clk_register is the primary interface for populating the clock tree with new
|
||||
* clock nodes. It returns a pointer to the newly allocated struct clk which
|
||||
* cannot be dereferenced by driver code but may be used in conjuction with the
|
||||
* rest of the clock API.
|
||||
*/
|
||||
struct clk *clk_register(struct device *dev, const char *name,
|
||||
const struct clk_ops *ops, struct clk_hw *hw,
|
||||
char **parent_names, u8 num_parents, unsigned long flags);
|
||||
|
||||
/* helper functions */
|
||||
const char *__clk_get_name(struct clk *clk);
|
||||
struct clk_hw *__clk_get_hw(struct clk *clk);
|
||||
u8 __clk_get_num_parents(struct clk *clk);
|
||||
struct clk *__clk_get_parent(struct clk *clk);
|
||||
inline int __clk_get_enable_count(struct clk *clk);
|
||||
inline int __clk_get_prepare_count(struct clk *clk);
|
||||
unsigned long __clk_get_rate(struct clk *clk);
|
||||
unsigned long __clk_get_flags(struct clk *clk);
|
||||
int __clk_is_enabled(struct clk *clk);
|
||||
struct clk *__clk_lookup(const char *name);
|
||||
|
||||
/*
|
||||
* FIXME clock api without lock protection
|
||||
*/
|
||||
int __clk_prepare(struct clk *clk);
|
||||
void __clk_unprepare(struct clk *clk);
|
||||
void __clk_reparent(struct clk *clk, struct clk *new_parent);
|
||||
unsigned long __clk_round_rate(struct clk *clk, unsigned long rate);
|
||||
|
||||
#endif /* CONFIG_COMMON_CLK */
|
||||
#endif /* CLK_PROVIDER_H */
|
||||
+66
-8
@@ -3,6 +3,7 @@
|
||||
*
|
||||
* Copyright (C) 2004 ARM Limited.
|
||||
* Written by Deep Blue Solutions Limited.
|
||||
* Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -12,19 +13,76 @@
|
||||
#define __LINUX_CLK_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/notifier.h>
|
||||
|
||||
struct device;
|
||||
|
||||
/*
|
||||
* The base API.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* struct clk - an machine class defined object / cookie.
|
||||
*/
|
||||
struct clk;
|
||||
|
||||
#ifdef CONFIG_COMMON_CLK
|
||||
|
||||
/**
|
||||
* DOC: clk notifier callback types
|
||||
*
|
||||
* PRE_RATE_CHANGE - called immediately before the clk rate is changed,
|
||||
* to indicate that the rate change will proceed. Drivers must
|
||||
* immediately terminate any operations that will be affected by the
|
||||
* rate change. Callbacks may either return NOTIFY_DONE or
|
||||
* NOTIFY_STOP.
|
||||
*
|
||||
* ABORT_RATE_CHANGE: called if the rate change failed for some reason
|
||||
* after PRE_RATE_CHANGE. In this case, all registered notifiers on
|
||||
* the clk will be called with ABORT_RATE_CHANGE. Callbacks must
|
||||
* always return NOTIFY_DONE.
|
||||
*
|
||||
* POST_RATE_CHANGE - called after the clk rate change has successfully
|
||||
* completed. Callbacks must always return NOTIFY_DONE.
|
||||
*
|
||||
*/
|
||||
#define PRE_RATE_CHANGE BIT(0)
|
||||
#define POST_RATE_CHANGE BIT(1)
|
||||
#define ABORT_RATE_CHANGE BIT(2)
|
||||
|
||||
/**
|
||||
* struct clk_notifier - associate a clk with a notifier
|
||||
* @clk: struct clk * to associate the notifier with
|
||||
* @notifier_head: a blocking_notifier_head for this clk
|
||||
* @node: linked list pointers
|
||||
*
|
||||
* A list of struct clk_notifier is maintained by the notifier code.
|
||||
* An entry is created whenever code registers the first notifier on a
|
||||
* particular @clk. Future notifiers on that @clk are added to the
|
||||
* @notifier_head.
|
||||
*/
|
||||
struct clk_notifier {
|
||||
struct clk *clk;
|
||||
struct srcu_notifier_head notifier_head;
|
||||
struct list_head node;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct clk_notifier_data - rate data to pass to the notifier callback
|
||||
* @clk: struct clk * being changed
|
||||
* @old_rate: previous rate of this clk
|
||||
* @new_rate: new rate of this clk
|
||||
*
|
||||
* For a pre-notifier, old_rate is the clk's rate before this rate
|
||||
* change, and new_rate is what the rate will be in the future. For a
|
||||
* post-notifier, old_rate and new_rate are both set to the clk's
|
||||
* current rate (this was done to optimize the implementation).
|
||||
*/
|
||||
struct clk_notifier_data {
|
||||
struct clk *clk;
|
||||
unsigned long old_rate;
|
||||
unsigned long new_rate;
|
||||
};
|
||||
|
||||
int clk_notifier_register(struct clk *clk, struct notifier_block *nb);
|
||||
|
||||
int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb);
|
||||
|
||||
#endif /* !CONFIG_COMMON_CLK */
|
||||
|
||||
/**
|
||||
* clk_get - lookup and obtain a reference to a clock producer.
|
||||
* @dev: device for clock "consumer"
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
/* this is used only to give gcc a clue about good code generation */
|
||||
union cnt32_to_63 {
|
||||
|
||||
+31
-1
@@ -19,6 +19,10 @@
|
||||
#include <asm/siginfo.h>
|
||||
#include <asm/signal.h>
|
||||
|
||||
#ifndef COMPAT_USE_64BIT_TIME
|
||||
#define COMPAT_USE_64BIT_TIME 0
|
||||
#endif
|
||||
|
||||
#define compat_jiffies_to_clock_t(x) \
|
||||
(((unsigned long)(x) * COMPAT_USER_HZ) / HZ)
|
||||
|
||||
@@ -83,10 +87,26 @@ typedef struct {
|
||||
compat_sigset_word sig[_COMPAT_NSIG_WORDS];
|
||||
} compat_sigset_t;
|
||||
|
||||
/*
|
||||
* These functions operate strictly on struct compat_time*
|
||||
*/
|
||||
extern int get_compat_timespec(struct timespec *,
|
||||
const struct compat_timespec __user *);
|
||||
extern int put_compat_timespec(const struct timespec *,
|
||||
struct compat_timespec __user *);
|
||||
extern int get_compat_timeval(struct timeval *,
|
||||
const struct compat_timeval __user *);
|
||||
extern int put_compat_timeval(const struct timeval *,
|
||||
struct compat_timeval __user *);
|
||||
/*
|
||||
* These functions operate on 32- or 64-bit specs depending on
|
||||
* COMPAT_USE_64BIT_TIME, hence the void user pointer arguments and the
|
||||
* naming as compat_get/put_ rather than get/put_compat_.
|
||||
*/
|
||||
extern int compat_get_timespec(struct timespec *, const void __user *);
|
||||
extern int compat_put_timespec(const struct timespec *, void __user *);
|
||||
extern int compat_get_timeval(struct timeval *, const void __user *);
|
||||
extern int compat_put_timeval(const struct timeval *, void __user *);
|
||||
|
||||
struct compat_iovec {
|
||||
compat_uptr_t iov_base;
|
||||
@@ -224,6 +244,7 @@ struct compat_sysinfo;
|
||||
struct compat_sysctl_args;
|
||||
struct compat_kexec_segment;
|
||||
struct compat_mq_attr;
|
||||
struct compat_msgbuf;
|
||||
|
||||
extern void compat_exit_robust_list(struct task_struct *curr);
|
||||
|
||||
@@ -234,13 +255,22 @@ asmlinkage long
|
||||
compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
|
||||
compat_size_t __user *len_ptr);
|
||||
|
||||
#ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC
|
||||
long compat_sys_semctl(int first, int second, int third, void __user *uptr);
|
||||
long compat_sys_msgsnd(int first, int second, int third, void __user *uptr);
|
||||
long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
|
||||
int version, void __user *uptr);
|
||||
long compat_sys_msgctl(int first, int second, void __user *uptr);
|
||||
long compat_sys_shmat(int first, int second, compat_uptr_t third, int version,
|
||||
void __user *uptr);
|
||||
#else
|
||||
long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
|
||||
long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp,
|
||||
size_t msgsz, int msgflg);
|
||||
long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp,
|
||||
size_t msgsz, long msgtyp, int msgflg);
|
||||
long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
|
||||
#endif
|
||||
long compat_sys_msgctl(int first, int second, void __user *uptr);
|
||||
long compat_sys_shmctl(int first, int second, void __user *uptr);
|
||||
long compat_sys_semtimedop(int semid, struct sembuf __user *tsems,
|
||||
unsigned nsems, const struct compat_timespec __user *timeout);
|
||||
|
||||
+19
-3
@@ -15,6 +15,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/hrtimer.h>
|
||||
|
||||
#define CPUIDLE_STATE_MAX 8
|
||||
#define CPUIDLE_NAME_LEN 16
|
||||
@@ -43,12 +44,15 @@ struct cpuidle_state {
|
||||
|
||||
unsigned int flags;
|
||||
unsigned int exit_latency; /* in US */
|
||||
unsigned int power_usage; /* in mW */
|
||||
int power_usage; /* in mW */
|
||||
unsigned int target_residency; /* in US */
|
||||
unsigned int disable;
|
||||
|
||||
int (*enter) (struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv,
|
||||
int index);
|
||||
|
||||
int (*enter_dead) (struct cpuidle_device *dev, int index);
|
||||
};
|
||||
|
||||
/* Idle State Flags */
|
||||
@@ -96,7 +100,6 @@ struct cpuidle_device {
|
||||
struct list_head device_list;
|
||||
struct kobject kobj;
|
||||
struct completion kobj_unregister;
|
||||
void *governor_data;
|
||||
};
|
||||
|
||||
DECLARE_PER_CPU(struct cpuidle_device *, cpuidle_devices);
|
||||
@@ -118,10 +121,12 @@ static inline int cpuidle_get_last_residency(struct cpuidle_device *dev)
|
||||
****************************/
|
||||
|
||||
struct cpuidle_driver {
|
||||
char name[CPUIDLE_NAME_LEN];
|
||||
const char *name;
|
||||
struct module *owner;
|
||||
|
||||
unsigned int power_specified:1;
|
||||
/* set to 1 to use the core cpuidle time keeping (for all states). */
|
||||
unsigned int en_core_tk_irqen:1;
|
||||
struct cpuidle_state states[CPUIDLE_STATE_MAX];
|
||||
int state_count;
|
||||
int safe_state_index;
|
||||
@@ -140,6 +145,11 @@ extern void cpuidle_pause_and_lock(void);
|
||||
extern void cpuidle_resume_and_unlock(void);
|
||||
extern int cpuidle_enable_device(struct cpuidle_device *dev);
|
||||
extern void cpuidle_disable_device(struct cpuidle_device *dev);
|
||||
extern int cpuidle_wrap_enter(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int index,
|
||||
int (*enter)(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int index));
|
||||
extern int cpuidle_play_dead(void);
|
||||
|
||||
#else
|
||||
static inline void disable_cpuidle(void) { }
|
||||
@@ -157,6 +167,12 @@ static inline void cpuidle_resume_and_unlock(void) { }
|
||||
static inline int cpuidle_enable_device(struct cpuidle_device *dev)
|
||||
{return -ENODEV; }
|
||||
static inline void cpuidle_disable_device(struct cpuidle_device *dev) { }
|
||||
static inline int cpuidle_wrap_enter(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int index,
|
||||
int (*enter)(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int index))
|
||||
{ return -ENODEV; }
|
||||
static inline int cpuidle_play_dead(void) {return -ENODEV; }
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -764,12 +764,6 @@ static inline const struct cpumask *get_cpu_mask(unsigned int cpu)
|
||||
*
|
||||
*/
|
||||
#ifndef CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS
|
||||
/* These strip const, as traditionally they weren't const. */
|
||||
#define cpu_possible_map (*(cpumask_t *)cpu_possible_mask)
|
||||
#define cpu_online_map (*(cpumask_t *)cpu_online_mask)
|
||||
#define cpu_present_map (*(cpumask_t *)cpu_present_mask)
|
||||
#define cpu_active_map (*(cpumask_t *)cpu_active_mask)
|
||||
|
||||
#define cpumask_of_cpu(cpu) (*get_cpu_mask(cpu))
|
||||
|
||||
#define CPU_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(NR_CPUS)
|
||||
@@ -810,11 +804,10 @@ static inline const struct cpumask *get_cpu_mask(unsigned int cpu)
|
||||
#else /* NR_CPUS > 1 */
|
||||
int __first_cpu(const cpumask_t *srcp);
|
||||
int __next_cpu(int n, const cpumask_t *srcp);
|
||||
int __any_online_cpu(const cpumask_t *mask);
|
||||
|
||||
#define first_cpu(src) __first_cpu(&(src))
|
||||
#define next_cpu(n, src) __next_cpu((n), &(src))
|
||||
#define any_online_cpu(mask) __any_online_cpu(&(mask))
|
||||
#define any_online_cpu(mask) cpumask_any_and(&mask, cpu_online_mask)
|
||||
#define for_each_cpu_mask(cpu, mask) \
|
||||
for ((cpu) = -1; \
|
||||
(cpu) = next_cpu((cpu), (mask)), \
|
||||
|
||||
@@ -22,7 +22,7 @@ extern int cpuset_init(void);
|
||||
extern void cpuset_init_smp(void);
|
||||
extern void cpuset_update_active_cpus(void);
|
||||
extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask);
|
||||
extern int cpuset_cpus_allowed_fallback(struct task_struct *p);
|
||||
extern void cpuset_cpus_allowed_fallback(struct task_struct *p);
|
||||
extern nodemask_t cpuset_mems_allowed(struct task_struct *p);
|
||||
#define cpuset_current_mems_allowed (current->mems_allowed)
|
||||
void cpuset_init_current_mems_allowed(void);
|
||||
@@ -135,10 +135,8 @@ static inline void cpuset_cpus_allowed(struct task_struct *p,
|
||||
cpumask_copy(mask, cpu_possible_mask);
|
||||
}
|
||||
|
||||
static inline int cpuset_cpus_allowed_fallback(struct task_struct *p)
|
||||
static inline void cpuset_cpus_allowed_fallback(struct task_struct *p)
|
||||
{
|
||||
do_set_cpus_allowed(p, cpu_possible_mask);
|
||||
return cpumask_any(cpu_active_mask);
|
||||
}
|
||||
|
||||
static inline nodemask_t cpuset_mems_allowed(struct task_struct *p)
|
||||
|
||||
@@ -100,3 +100,6 @@ struct crypto_report_rng {
|
||||
char type[CRYPTO_MAX_NAME];
|
||||
unsigned int seedsize;
|
||||
};
|
||||
|
||||
#define CRYPTO_REPORT_MAXSIZE (sizeof(struct crypto_user_alg) + \
|
||||
sizeof(struct crypto_report_blkcipher))
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bug.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
struct task_struct;
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
enum dma_attr {
|
||||
DMA_ATTR_WRITE_BARRIER,
|
||||
DMA_ATTR_WEAK_ORDERING,
|
||||
DMA_ATTR_WRITE_COMBINE,
|
||||
DMA_ATTR_NON_CONSISTENT,
|
||||
DMA_ATTR_MAX,
|
||||
};
|
||||
|
||||
|
||||
+87
-10
@@ -29,6 +29,7 @@
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/fs.h>
|
||||
|
||||
struct device;
|
||||
struct dma_buf;
|
||||
@@ -49,6 +50,17 @@ struct dma_buf_attachment;
|
||||
* @unmap_dma_buf: decreases usecount of buffer, might deallocate scatter
|
||||
* pages.
|
||||
* @release: release this buffer; to be called after the last dma_buf_put.
|
||||
* @begin_cpu_access: [optional] called before cpu access to invalidate cpu
|
||||
* caches and allocate backing storage (if not yet done)
|
||||
* respectively pin the objet into memory.
|
||||
* @end_cpu_access: [optional] called after cpu access to flush cashes.
|
||||
* @kmap_atomic: maps a page from the buffer into kernel address
|
||||
* space, users may not block until the subsequent unmap call.
|
||||
* This callback must not sleep.
|
||||
* @kunmap_atomic: [optional] unmaps a atomically mapped page from the buffer.
|
||||
* This Callback must not sleep.
|
||||
* @kmap: maps a page from the buffer into kernel address space.
|
||||
* @kunmap: [optional] unmaps a page from the buffer.
|
||||
*/
|
||||
struct dma_buf_ops {
|
||||
int (*attach)(struct dma_buf *, struct device *,
|
||||
@@ -63,7 +75,8 @@ struct dma_buf_ops {
|
||||
struct sg_table * (*map_dma_buf)(struct dma_buf_attachment *,
|
||||
enum dma_data_direction);
|
||||
void (*unmap_dma_buf)(struct dma_buf_attachment *,
|
||||
struct sg_table *);
|
||||
struct sg_table *,
|
||||
enum dma_data_direction);
|
||||
/* TODO: Add try_map_dma_buf version, to return immed with -EBUSY
|
||||
* if the call would block.
|
||||
*/
|
||||
@@ -71,6 +84,14 @@ struct dma_buf_ops {
|
||||
/* after final dma_buf_put() */
|
||||
void (*release)(struct dma_buf *);
|
||||
|
||||
int (*begin_cpu_access)(struct dma_buf *, size_t, size_t,
|
||||
enum dma_data_direction);
|
||||
void (*end_cpu_access)(struct dma_buf *, size_t, size_t,
|
||||
enum dma_data_direction);
|
||||
void *(*kmap_atomic)(struct dma_buf *, unsigned long);
|
||||
void (*kunmap_atomic)(struct dma_buf *, unsigned long, void *);
|
||||
void *(*kmap)(struct dma_buf *, unsigned long);
|
||||
void (*kunmap)(struct dma_buf *, unsigned long, void *);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -86,7 +107,7 @@ struct dma_buf {
|
||||
struct file *file;
|
||||
struct list_head attachments;
|
||||
const struct dma_buf_ops *ops;
|
||||
/* mutex to serialize list manipulation and other ops */
|
||||
/* mutex to serialize list manipulation and attach/detach */
|
||||
struct mutex lock;
|
||||
void *priv;
|
||||
};
|
||||
@@ -109,20 +130,43 @@ struct dma_buf_attachment {
|
||||
void *priv;
|
||||
};
|
||||
|
||||
/**
|
||||
* get_dma_buf - convenience wrapper for get_file.
|
||||
* @dmabuf: [in] pointer to dma_buf
|
||||
*
|
||||
* Increments the reference count on the dma-buf, needed in case of drivers
|
||||
* that either need to create additional references to the dmabuf on the
|
||||
* kernel side. For example, an exporter that needs to keep a dmabuf ptr
|
||||
* so that subsequent exports don't create a new dmabuf.
|
||||
*/
|
||||
static inline void get_dma_buf(struct dma_buf *dmabuf)
|
||||
{
|
||||
get_file(dmabuf->file);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DMA_SHARED_BUFFER
|
||||
struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
|
||||
struct device *dev);
|
||||
void dma_buf_detach(struct dma_buf *dmabuf,
|
||||
struct dma_buf_attachment *dmabuf_attach);
|
||||
struct dma_buf *dma_buf_export(void *priv, struct dma_buf_ops *ops,
|
||||
size_t size, int flags);
|
||||
int dma_buf_fd(struct dma_buf *dmabuf);
|
||||
struct dma_buf *dma_buf_export(void *priv, const struct dma_buf_ops *ops,
|
||||
size_t size, int flags);
|
||||
int dma_buf_fd(struct dma_buf *dmabuf, int flags);
|
||||
struct dma_buf *dma_buf_get(int fd);
|
||||
void dma_buf_put(struct dma_buf *dmabuf);
|
||||
|
||||
struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *,
|
||||
enum dma_data_direction);
|
||||
void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *);
|
||||
void dma_buf_unmap_attachment(struct dma_buf_attachment *, struct sg_table *,
|
||||
enum dma_data_direction);
|
||||
int dma_buf_begin_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
|
||||
enum dma_data_direction dir);
|
||||
void dma_buf_end_cpu_access(struct dma_buf *dma_buf, size_t start, size_t len,
|
||||
enum dma_data_direction dir);
|
||||
void *dma_buf_kmap_atomic(struct dma_buf *, unsigned long);
|
||||
void dma_buf_kunmap_atomic(struct dma_buf *, unsigned long, void *);
|
||||
void *dma_buf_kmap(struct dma_buf *, unsigned long);
|
||||
void dma_buf_kunmap(struct dma_buf *, unsigned long, void *);
|
||||
#else
|
||||
|
||||
static inline struct dma_buf_attachment *dma_buf_attach(struct dma_buf *dmabuf,
|
||||
@@ -138,13 +182,13 @@ static inline void dma_buf_detach(struct dma_buf *dmabuf,
|
||||
}
|
||||
|
||||
static inline struct dma_buf *dma_buf_export(void *priv,
|
||||
struct dma_buf_ops *ops,
|
||||
size_t size, int flags)
|
||||
const struct dma_buf_ops *ops,
|
||||
size_t size, int flags)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline int dma_buf_fd(struct dma_buf *dmabuf)
|
||||
static inline int dma_buf_fd(struct dma_buf *dmabuf, int flags)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
@@ -166,11 +210,44 @@ static inline struct sg_table *dma_buf_map_attachment(
|
||||
}
|
||||
|
||||
static inline void dma_buf_unmap_attachment(struct dma_buf_attachment *attach,
|
||||
struct sg_table *sg)
|
||||
struct sg_table *sg, enum dma_data_direction dir)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline int dma_buf_begin_cpu_access(struct dma_buf *dmabuf,
|
||||
size_t start, size_t len,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline void dma_buf_end_cpu_access(struct dma_buf *dmabuf,
|
||||
size_t start, size_t len,
|
||||
enum dma_data_direction dir)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void *dma_buf_kmap_atomic(struct dma_buf *dmabuf,
|
||||
unsigned long pnum)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void dma_buf_kunmap_atomic(struct dma_buf *dmabuf,
|
||||
unsigned long pnum, void *vaddr)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void *dma_buf_kmap(struct dma_buf *dmabuf, unsigned long pnum)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void dma_buf_kunmap(struct dma_buf *dmabuf,
|
||||
unsigned long pnum, void *vaddr)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_DMA_SHARED_BUFFER */
|
||||
|
||||
#endif /* __DMA_BUF_H__ */
|
||||
|
||||
@@ -9,10 +9,15 @@
|
||||
#include <linux/scatterlist.h>
|
||||
|
||||
struct dma_map_ops {
|
||||
void* (*alloc_coherent)(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t gfp);
|
||||
void (*free_coherent)(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle);
|
||||
void* (*alloc)(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t gfp,
|
||||
struct dma_attrs *attrs);
|
||||
void (*free)(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle,
|
||||
struct dma_attrs *attrs);
|
||||
int (*mmap)(struct device *, struct vm_area_struct *,
|
||||
void *, dma_addr_t, size_t, struct dma_attrs *attrs);
|
||||
|
||||
dma_addr_t (*map_page)(struct device *dev, struct page *page,
|
||||
unsigned long offset, size_t size,
|
||||
enum dma_data_direction dir,
|
||||
@@ -77,7 +82,7 @@ static inline u64 dma_get_mask(struct device *dev)
|
||||
return DMA_BIT_MASK(32);
|
||||
}
|
||||
|
||||
#ifdef ARCH_HAS_DMA_SET_COHERENT_MASK
|
||||
#ifdef CONFIG_ARCH_HAS_DMA_SET_COHERENT_MASK
|
||||
int dma_set_coherent_mask(struct device *dev, u64 mask);
|
||||
#else
|
||||
static inline int dma_set_coherent_mask(struct device *dev, u64 mask)
|
||||
|
||||
@@ -18,14 +18,15 @@
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called COPYING.
|
||||
*/
|
||||
#ifndef DMAENGINE_H
|
||||
#define DMAENGINE_H
|
||||
#ifndef LINUX_DMAENGINE_H
|
||||
#define LINUX_DMAENGINE_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/**
|
||||
@@ -258,6 +259,7 @@ struct dma_chan_percpu {
|
||||
* struct dma_chan - devices supply DMA channels, clients use them
|
||||
* @device: ptr to the dma device who supplies this channel, always !%NULL
|
||||
* @cookie: last cookie value returned to client
|
||||
* @completed_cookie: last completed cookie for this channel
|
||||
* @chan_id: channel ID for sysfs
|
||||
* @dev: class device for sysfs
|
||||
* @device_node: used to add this to the device chan list
|
||||
@@ -269,6 +271,7 @@ struct dma_chan_percpu {
|
||||
struct dma_chan {
|
||||
struct dma_device *device;
|
||||
dma_cookie_t cookie;
|
||||
dma_cookie_t completed_cookie;
|
||||
|
||||
/* sysfs */
|
||||
int chan_id;
|
||||
@@ -332,6 +335,9 @@ enum dma_slave_buswidth {
|
||||
* may or may not be applicable on memory sources.
|
||||
* @dst_maxburst: same as src_maxburst but for destination target
|
||||
* mutatis mutandis.
|
||||
* @device_fc: Flow Controller Settings. Only valid for slave channels. Fill
|
||||
* with 'true' if peripheral should be flow controller. Direction will be
|
||||
* selected at Runtime.
|
||||
*
|
||||
* This struct is passed in as configuration data to a DMA engine
|
||||
* in order to set up a certain channel for DMA transport at runtime.
|
||||
@@ -358,6 +364,7 @@ struct dma_slave_config {
|
||||
enum dma_slave_buswidth dst_addr_width;
|
||||
u32 src_maxburst;
|
||||
u32 dst_maxburst;
|
||||
bool device_fc;
|
||||
};
|
||||
|
||||
static inline const char *dma_chan_name(struct dma_chan *chan)
|
||||
@@ -576,10 +583,11 @@ struct dma_device {
|
||||
struct dma_async_tx_descriptor *(*device_prep_slave_sg)(
|
||||
struct dma_chan *chan, struct scatterlist *sgl,
|
||||
unsigned int sg_len, enum dma_transfer_direction direction,
|
||||
unsigned long flags);
|
||||
unsigned long flags, void *context);
|
||||
struct dma_async_tx_descriptor *(*device_prep_dma_cyclic)(
|
||||
struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction direction);
|
||||
size_t period_len, enum dma_transfer_direction direction,
|
||||
void *context);
|
||||
struct dma_async_tx_descriptor *(*device_prep_interleaved_dma)(
|
||||
struct dma_chan *chan, struct dma_interleaved_template *xt,
|
||||
unsigned long flags);
|
||||
@@ -613,7 +621,24 @@ static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_single(
|
||||
struct scatterlist sg;
|
||||
sg_init_one(&sg, buf, len);
|
||||
|
||||
return chan->device->device_prep_slave_sg(chan, &sg, 1, dir, flags);
|
||||
return chan->device->device_prep_slave_sg(chan, &sg, 1,
|
||||
dir, flags, NULL);
|
||||
}
|
||||
|
||||
static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_sg(
|
||||
struct dma_chan *chan, struct scatterlist *sgl, unsigned int sg_len,
|
||||
enum dma_transfer_direction dir, unsigned long flags)
|
||||
{
|
||||
return chan->device->device_prep_slave_sg(chan, sgl, sg_len,
|
||||
dir, flags, NULL);
|
||||
}
|
||||
|
||||
static inline struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(
|
||||
struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
|
||||
size_t period_len, enum dma_transfer_direction dir)
|
||||
{
|
||||
return chan->device->device_prep_dma_cyclic(chan, buf_addr, buf_len,
|
||||
period_len, dir, NULL);
|
||||
}
|
||||
|
||||
static inline int dmaengine_terminate_all(struct dma_chan *chan)
|
||||
|
||||
@@ -31,18 +31,6 @@ struct dw_dma_platform_data {
|
||||
unsigned char chan_priority;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum dw_dma_slave_width - DMA slave register access width.
|
||||
* @DMA_SLAVE_WIDTH_8BIT: Do 8-bit slave register accesses
|
||||
* @DMA_SLAVE_WIDTH_16BIT: Do 16-bit slave register accesses
|
||||
* @DMA_SLAVE_WIDTH_32BIT: Do 32-bit slave register accesses
|
||||
*/
|
||||
enum dw_dma_slave_width {
|
||||
DW_DMA_SLAVE_WIDTH_8BIT,
|
||||
DW_DMA_SLAVE_WIDTH_16BIT,
|
||||
DW_DMA_SLAVE_WIDTH_32BIT,
|
||||
};
|
||||
|
||||
/* bursts size */
|
||||
enum dw_dma_msize {
|
||||
DW_DMA_MSIZE_1,
|
||||
@@ -55,47 +43,21 @@ enum dw_dma_msize {
|
||||
DW_DMA_MSIZE_256,
|
||||
};
|
||||
|
||||
/* flow controller */
|
||||
enum dw_dma_fc {
|
||||
DW_DMA_FC_D_M2M,
|
||||
DW_DMA_FC_D_M2P,
|
||||
DW_DMA_FC_D_P2M,
|
||||
DW_DMA_FC_D_P2P,
|
||||
DW_DMA_FC_P_P2M,
|
||||
DW_DMA_FC_SP_P2P,
|
||||
DW_DMA_FC_P_M2P,
|
||||
DW_DMA_FC_DP_P2P,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dw_dma_slave - Controller-specific information about a slave
|
||||
*
|
||||
* @dma_dev: required DMA master device
|
||||
* @tx_reg: physical address of data register used for
|
||||
* memory-to-peripheral transfers
|
||||
* @rx_reg: physical address of data register used for
|
||||
* peripheral-to-memory transfers
|
||||
* @reg_width: peripheral register width
|
||||
* @cfg_hi: Platform-specific initializer for the CFG_HI register
|
||||
* @cfg_lo: Platform-specific initializer for the CFG_LO register
|
||||
* @src_master: src master for transfers on allocated channel.
|
||||
* @dst_master: dest master for transfers on allocated channel.
|
||||
* @src_msize: src burst size.
|
||||
* @dst_msize: dest burst size.
|
||||
* @fc: flow controller for DMA transfer
|
||||
*/
|
||||
struct dw_dma_slave {
|
||||
struct device *dma_dev;
|
||||
dma_addr_t tx_reg;
|
||||
dma_addr_t rx_reg;
|
||||
enum dw_dma_slave_width reg_width;
|
||||
u32 cfg_hi;
|
||||
u32 cfg_lo;
|
||||
u8 src_master;
|
||||
u8 dst_master;
|
||||
u8 src_msize;
|
||||
u8 dst_msize;
|
||||
u8 fc;
|
||||
};
|
||||
|
||||
/* Platform-configurable bits in CFG_HI */
|
||||
|
||||
+128
-51
@@ -70,25 +70,64 @@ enum dev_type {
|
||||
#define DEV_FLAG_X32 BIT(DEV_X32)
|
||||
#define DEV_FLAG_X64 BIT(DEV_X64)
|
||||
|
||||
/* memory types */
|
||||
/**
|
||||
* enum mem_type - memory types. For a more detailed reference, please see
|
||||
* http://en.wikipedia.org/wiki/DRAM
|
||||
*
|
||||
* @MEM_EMPTY Empty csrow
|
||||
* @MEM_RESERVED: Reserved csrow type
|
||||
* @MEM_UNKNOWN: Unknown csrow type
|
||||
* @MEM_FPM: FPM - Fast Page Mode, used on systems up to 1995.
|
||||
* @MEM_EDO: EDO - Extended data out, used on systems up to 1998.
|
||||
* @MEM_BEDO: BEDO - Burst Extended data out, an EDO variant.
|
||||
* @MEM_SDR: SDR - Single data rate SDRAM
|
||||
* http://en.wikipedia.org/wiki/Synchronous_dynamic_random-access_memory
|
||||
* They use 3 pins for chip select: Pins 0 and 2 are
|
||||
* for rank 0; pins 1 and 3 are for rank 1, if the memory
|
||||
* is dual-rank.
|
||||
* @MEM_RDR: Registered SDR SDRAM
|
||||
* @MEM_DDR: Double data rate SDRAM
|
||||
* http://en.wikipedia.org/wiki/DDR_SDRAM
|
||||
* @MEM_RDDR: Registered Double data rate SDRAM
|
||||
* This is a variant of the DDR memories.
|
||||
* A registered memory has a buffer inside it, hiding
|
||||
* part of the memory details to the memory controller.
|
||||
* @MEM_RMBS: Rambus DRAM, used on a few Pentium III/IV controllers.
|
||||
* @MEM_DDR2: DDR2 RAM, as described at JEDEC JESD79-2F.
|
||||
* Those memories are labed as "PC2-" instead of "PC" to
|
||||
* differenciate from DDR.
|
||||
* @MEM_FB_DDR2: Fully-Buffered DDR2, as described at JEDEC Std No. 205
|
||||
* and JESD206.
|
||||
* Those memories are accessed per DIMM slot, and not by
|
||||
* a chip select signal.
|
||||
* @MEM_RDDR2: Registered DDR2 RAM
|
||||
* This is a variant of the DDR2 memories.
|
||||
* @MEM_XDR: Rambus XDR
|
||||
* It is an evolution of the original RAMBUS memories,
|
||||
* created to compete with DDR2. Weren't used on any
|
||||
* x86 arch, but cell_edac PPC memory controller uses it.
|
||||
* @MEM_DDR3: DDR3 RAM
|
||||
* @MEM_RDDR3: Registered DDR3 RAM
|
||||
* This is a variant of the DDR3 memories.
|
||||
*/
|
||||
enum mem_type {
|
||||
MEM_EMPTY = 0, /* Empty csrow */
|
||||
MEM_RESERVED, /* Reserved csrow type */
|
||||
MEM_UNKNOWN, /* Unknown csrow type */
|
||||
MEM_FPM, /* Fast page mode */
|
||||
MEM_EDO, /* Extended data out */
|
||||
MEM_BEDO, /* Burst Extended data out */
|
||||
MEM_SDR, /* Single data rate SDRAM */
|
||||
MEM_RDR, /* Registered single data rate SDRAM */
|
||||
MEM_DDR, /* Double data rate SDRAM */
|
||||
MEM_RDDR, /* Registered Double data rate SDRAM */
|
||||
MEM_RMBS, /* Rambus DRAM */
|
||||
MEM_DDR2, /* DDR2 RAM */
|
||||
MEM_FB_DDR2, /* fully buffered DDR2 */
|
||||
MEM_RDDR2, /* Registered DDR2 RAM */
|
||||
MEM_XDR, /* Rambus XDR */
|
||||
MEM_DDR3, /* DDR3 RAM */
|
||||
MEM_RDDR3, /* Registered DDR3 RAM */
|
||||
MEM_EMPTY = 0,
|
||||
MEM_RESERVED,
|
||||
MEM_UNKNOWN,
|
||||
MEM_FPM,
|
||||
MEM_EDO,
|
||||
MEM_BEDO,
|
||||
MEM_SDR,
|
||||
MEM_RDR,
|
||||
MEM_DDR,
|
||||
MEM_RDDR,
|
||||
MEM_RMBS,
|
||||
MEM_DDR2,
|
||||
MEM_FB_DDR2,
|
||||
MEM_RDDR2,
|
||||
MEM_XDR,
|
||||
MEM_DDR3,
|
||||
MEM_RDDR3,
|
||||
};
|
||||
|
||||
#define MEM_FLAG_EMPTY BIT(MEM_EMPTY)
|
||||
@@ -166,8 +205,9 @@ enum scrub_type {
|
||||
#define OP_OFFLINE 0x300
|
||||
|
||||
/*
|
||||
* There are several things to be aware of that aren't at all obvious:
|
||||
* Concepts used at the EDAC subsystem
|
||||
*
|
||||
* There are several things to be aware of that aren't at all obvious:
|
||||
*
|
||||
* SOCKETS, SOCKET SETS, BANKS, ROWS, CHIP-SELECT ROWS, CHANNELS, etc..
|
||||
*
|
||||
@@ -176,36 +216,61 @@ enum scrub_type {
|
||||
* creating a common ground for discussion, terms and their definitions
|
||||
* will be established.
|
||||
*
|
||||
* Memory devices: The individual chip on a memory stick. These devices
|
||||
* commonly output 4 and 8 bits each. Grouping several
|
||||
* of these in parallel provides 64 bits which is common
|
||||
* for a memory stick.
|
||||
* Memory devices: The individual DRAM chips on a memory stick. These
|
||||
* devices commonly output 4 and 8 bits each (x4, x8).
|
||||
* Grouping several of these in parallel provides the
|
||||
* number of bits that the memory controller expects:
|
||||
* typically 72 bits, in order to provide 64 bits +
|
||||
* 8 bits of ECC data.
|
||||
*
|
||||
* Memory Stick: A printed circuit board that aggregates multiple
|
||||
* memory devices in parallel. This is the atomic
|
||||
* memory component that is purchaseable by Joe consumer
|
||||
* and loaded into a memory socket.
|
||||
* memory devices in parallel. In general, this is the
|
||||
* Field Replaceable Unit (FRU) which gets replaced, in
|
||||
* the case of excessive errors. Most often it is also
|
||||
* called DIMM (Dual Inline Memory Module).
|
||||
*
|
||||
* Socket: A physical connector on the motherboard that accepts
|
||||
* a single memory stick.
|
||||
* Memory Socket: A physical connector on the motherboard that accepts
|
||||
* a single memory stick. Also called as "slot" on several
|
||||
* datasheets.
|
||||
*
|
||||
* Channel: Set of memory devices on a memory stick that must be
|
||||
* grouped in parallel with one or more additional
|
||||
* channels from other memory sticks. This parallel
|
||||
* grouping of the output from multiple channels are
|
||||
* necessary for the smallest granularity of memory access.
|
||||
* Some memory controllers are capable of single channel -
|
||||
* which means that memory sticks can be loaded
|
||||
* individually. Other memory controllers are only
|
||||
* capable of dual channel - which means that memory
|
||||
* sticks must be loaded as pairs (see "socket set").
|
||||
* Channel: A memory controller channel, responsible to communicate
|
||||
* with a group of DIMMs. Each channel has its own
|
||||
* independent control (command) and data bus, and can
|
||||
* be used independently or grouped with other channels.
|
||||
*
|
||||
* Chip-select row: All of the memory devices that are selected together.
|
||||
* for a single, minimum grain of memory access.
|
||||
* This selects all of the parallel memory devices across
|
||||
* all of the parallel channels. Common chip-select rows
|
||||
* for single channel are 64 bits, for dual channel 128
|
||||
* bits.
|
||||
* Branch: It is typically the highest hierarchy on a
|
||||
* Fully-Buffered DIMM memory controller.
|
||||
* Typically, it contains two channels.
|
||||
* Two channels at the same branch can be used in single
|
||||
* mode or in lockstep mode.
|
||||
* When lockstep is enabled, the cacheline is doubled,
|
||||
* but it generally brings some performance penalty.
|
||||
* Also, it is generally not possible to point to just one
|
||||
* memory stick when an error occurs, as the error
|
||||
* correction code is calculated using two DIMMs instead
|
||||
* of one. Due to that, it is capable of correcting more
|
||||
* errors than on single mode.
|
||||
*
|
||||
* Single-channel: The data accessed by the memory controller is contained
|
||||
* into one dimm only. E. g. if the data is 64 bits-wide,
|
||||
* the data flows to the CPU using one 64 bits parallel
|
||||
* access.
|
||||
* Typically used with SDR, DDR, DDR2 and DDR3 memories.
|
||||
* FB-DIMM and RAMBUS use a different concept for channel,
|
||||
* so this concept doesn't apply there.
|
||||
*
|
||||
* Double-channel: The data size accessed by the memory controller is
|
||||
* interlaced into two dimms, accessed at the same time.
|
||||
* E. g. if the DIMM is 64 bits-wide (72 bits with ECC),
|
||||
* the data flows to the CPU using a 128 bits parallel
|
||||
* access.
|
||||
*
|
||||
* Chip-select row: This is the name of the DRAM signal used to select the
|
||||
* DRAM ranks to be accessed. Common chip-select rows for
|
||||
* single channel are 64 bits, for dual channel 128 bits.
|
||||
* It may not be visible by the memory controller, as some
|
||||
* DIMM types have a memory buffer that can hide direct
|
||||
* access to it from the Memory Controller.
|
||||
*
|
||||
* Single-Ranked stick: A Single-ranked stick has 1 chip-select row of memory.
|
||||
* Motherboards commonly drive two chip-select pins to
|
||||
@@ -218,8 +283,8 @@ enum scrub_type {
|
||||
*
|
||||
* Double-sided stick: DEPRECATED TERM, see Double-Ranked stick.
|
||||
* A double-sided stick has two chip-select rows which
|
||||
* access different sets of memory devices. The two
|
||||
* rows cannot be accessed concurrently. "Double-sided"
|
||||
* access different sets of memory devices. The two
|
||||
* rows cannot be accessed concurrently. "Double-sided"
|
||||
* is irrespective of the memory devices being mounted
|
||||
* on both sides of the memory stick.
|
||||
*
|
||||
@@ -247,10 +312,22 @@ enum scrub_type {
|
||||
* PS - I enjoyed writing all that about as much as you enjoyed reading it.
|
||||
*/
|
||||
|
||||
struct channel_info {
|
||||
int chan_idx; /* channel index */
|
||||
u32 ce_count; /* Correctable Errors for this CHANNEL */
|
||||
char label[EDAC_MC_LABEL_LEN + 1]; /* DIMM label on motherboard */
|
||||
/**
|
||||
* struct rank_info - contains the information for one DIMM rank
|
||||
*
|
||||
* @chan_idx: channel number where the rank is (typically, 0 or 1)
|
||||
* @ce_count: number of correctable errors for this rank
|
||||
* @label: DIMM label. Different ranks for the same DIMM should be
|
||||
* filled, on userspace, with the same label.
|
||||
* FIXME: The core currently won't enforce it.
|
||||
* @csrow: A pointer to the chip select row structure (the parent
|
||||
* structure). The location of the rank is given by
|
||||
* the (csrow->csrow_idx, chan_idx) vector.
|
||||
*/
|
||||
struct rank_info {
|
||||
int chan_idx;
|
||||
u32 ce_count;
|
||||
char label[EDAC_MC_LABEL_LEN + 1];
|
||||
struct csrow_info *csrow; /* the parent */
|
||||
};
|
||||
|
||||
@@ -274,7 +351,7 @@ struct csrow_info {
|
||||
|
||||
/* channel information for this csrow */
|
||||
u32 nr_channels;
|
||||
struct channel_info *channels;
|
||||
struct rank_info *channels;
|
||||
};
|
||||
|
||||
struct mcidev_sysfs_group {
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include <linux/pstore.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#define EFI_SUCCESS 0
|
||||
#define EFI_LOAD_ERROR ( 1 | (1UL << (BITS_PER_LONG-1)))
|
||||
|
||||
@@ -923,8 +923,7 @@ static inline u32 ethtool_rxfh_indir_default(u32 index, u32 n_rx_rings)
|
||||
*
|
||||
* All operations are optional (i.e. the function pointer may be set
|
||||
* to %NULL) and callers must take this into account. Callers must
|
||||
* hold the RTNL, except that for @get_drvinfo the caller may or may
|
||||
* not hold the RTNL.
|
||||
* hold the RTNL lock.
|
||||
*
|
||||
* See the structures used by these operations for further documentation.
|
||||
*
|
||||
|
||||
+10
-559
@@ -18,574 +18,25 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/fs.h>
|
||||
|
||||
/*
|
||||
* The second extended filesystem constants/structures
|
||||
*/
|
||||
|
||||
/*
|
||||
* Define EXT2FS_DEBUG to produce debug messages
|
||||
*/
|
||||
#undef EXT2FS_DEBUG
|
||||
|
||||
/*
|
||||
* Define EXT2_RESERVATION to reserve data blocks for expanding files
|
||||
*/
|
||||
#define EXT2_DEFAULT_RESERVE_BLOCKS 8
|
||||
/*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */
|
||||
#define EXT2_MAX_RESERVE_BLOCKS 1027
|
||||
#define EXT2_RESERVE_WINDOW_NOT_ALLOCATED 0
|
||||
/*
|
||||
* The second extended file system version
|
||||
*/
|
||||
#define EXT2FS_DATE "95/08/09"
|
||||
#define EXT2FS_VERSION "0.5b"
|
||||
|
||||
/*
|
||||
* Debug code
|
||||
*/
|
||||
#ifdef EXT2FS_DEBUG
|
||||
# define ext2_debug(f, a...) { \
|
||||
printk ("EXT2-fs DEBUG (%s, %d): %s:", \
|
||||
__FILE__, __LINE__, __func__); \
|
||||
printk (f, ## a); \
|
||||
}
|
||||
#else
|
||||
# define ext2_debug(f, a...) /**/
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Special inode numbers
|
||||
*/
|
||||
#define EXT2_BAD_INO 1 /* Bad blocks inode */
|
||||
#define EXT2_ROOT_INO 2 /* Root inode */
|
||||
#define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */
|
||||
#define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */
|
||||
|
||||
/* First non-reserved inode for old ext2 filesystems */
|
||||
#define EXT2_GOOD_OLD_FIRST_INO 11
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/ext2_fs_sb.h>
|
||||
static inline struct ext2_sb_info *EXT2_SB(struct super_block *sb)
|
||||
{
|
||||
return sb->s_fs_info;
|
||||
}
|
||||
#else
|
||||
/* Assume that user mode programs are passing in an ext2fs superblock, not
|
||||
* a kernel struct super_block. This will allow us to call the feature-test
|
||||
* macros from user land. */
|
||||
#define EXT2_SB(sb) (sb)
|
||||
#endif
|
||||
#define EXT2_NAME_LEN 255
|
||||
|
||||
/*
|
||||
* Maximal count of links to a file
|
||||
*/
|
||||
#define EXT2_LINK_MAX 32000
|
||||
|
||||
/*
|
||||
* Macro-instructions used to manage several block sizes
|
||||
*/
|
||||
#define EXT2_MIN_BLOCK_SIZE 1024
|
||||
#define EXT2_MAX_BLOCK_SIZE 4096
|
||||
#define EXT2_MIN_BLOCK_LOG_SIZE 10
|
||||
#ifdef __KERNEL__
|
||||
# define EXT2_BLOCK_SIZE(s) ((s)->s_blocksize)
|
||||
#else
|
||||
# define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size)
|
||||
#endif
|
||||
#define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32))
|
||||
#ifdef __KERNEL__
|
||||
# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits)
|
||||
#else
|
||||
# define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
|
||||
#endif
|
||||
#ifdef __KERNEL__
|
||||
#define EXT2_ADDR_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_addr_per_block_bits)
|
||||
#define EXT2_INODE_SIZE(s) (EXT2_SB(s)->s_inode_size)
|
||||
#define EXT2_FIRST_INO(s) (EXT2_SB(s)->s_first_ino)
|
||||
#else
|
||||
#define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
|
||||
EXT2_GOOD_OLD_INODE_SIZE : \
|
||||
(s)->s_inode_size)
|
||||
#define EXT2_FIRST_INO(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
|
||||
EXT2_GOOD_OLD_FIRST_INO : \
|
||||
(s)->s_first_ino)
|
||||
#endif
|
||||
#define EXT2_SB_MAGIC_OFFSET 0x38
|
||||
#define EXT2_SB_BLOCKS_OFFSET 0x04
|
||||
#define EXT2_SB_BSIZE_OFFSET 0x18
|
||||
|
||||
/*
|
||||
* Macro-instructions used to manage fragments
|
||||
*/
|
||||
#define EXT2_MIN_FRAG_SIZE 1024
|
||||
#define EXT2_MAX_FRAG_SIZE 4096
|
||||
#define EXT2_MIN_FRAG_LOG_SIZE 10
|
||||
#ifdef __KERNEL__
|
||||
# define EXT2_FRAG_SIZE(s) (EXT2_SB(s)->s_frag_size)
|
||||
# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_SB(s)->s_frags_per_block)
|
||||
#else
|
||||
# define EXT2_FRAG_SIZE(s) (EXT2_MIN_FRAG_SIZE << (s)->s_log_frag_size)
|
||||
# define EXT2_FRAGS_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / EXT2_FRAG_SIZE(s))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Structure of a blocks group descriptor
|
||||
*/
|
||||
struct ext2_group_desc
|
||||
static inline u64 ext2_image_size(void *ext2_sb)
|
||||
{
|
||||
__le32 bg_block_bitmap; /* Blocks bitmap block */
|
||||
__le32 bg_inode_bitmap; /* Inodes bitmap block */
|
||||
__le32 bg_inode_table; /* Inodes table block */
|
||||
__le16 bg_free_blocks_count; /* Free blocks count */
|
||||
__le16 bg_free_inodes_count; /* Free inodes count */
|
||||
__le16 bg_used_dirs_count; /* Directories count */
|
||||
__le16 bg_pad;
|
||||
__le32 bg_reserved[3];
|
||||
};
|
||||
|
||||
/*
|
||||
* Macro-instructions used to manage group descriptors
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
# define EXT2_BLOCKS_PER_GROUP(s) (EXT2_SB(s)->s_blocks_per_group)
|
||||
# define EXT2_DESC_PER_BLOCK(s) (EXT2_SB(s)->s_desc_per_block)
|
||||
# define EXT2_INODES_PER_GROUP(s) (EXT2_SB(s)->s_inodes_per_group)
|
||||
# define EXT2_DESC_PER_BLOCK_BITS(s) (EXT2_SB(s)->s_desc_per_block_bits)
|
||||
#else
|
||||
# define EXT2_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group)
|
||||
# define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_group_desc))
|
||||
# define EXT2_INODES_PER_GROUP(s) ((s)->s_inodes_per_group)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Constants relative to the data blocks
|
||||
*/
|
||||
#define EXT2_NDIR_BLOCKS 12
|
||||
#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
|
||||
#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
|
||||
#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
|
||||
#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
|
||||
|
||||
/*
|
||||
* Inode flags (GETFLAGS/SETFLAGS)
|
||||
*/
|
||||
#define EXT2_SECRM_FL FS_SECRM_FL /* Secure deletion */
|
||||
#define EXT2_UNRM_FL FS_UNRM_FL /* Undelete */
|
||||
#define EXT2_COMPR_FL FS_COMPR_FL /* Compress file */
|
||||
#define EXT2_SYNC_FL FS_SYNC_FL /* Synchronous updates */
|
||||
#define EXT2_IMMUTABLE_FL FS_IMMUTABLE_FL /* Immutable file */
|
||||
#define EXT2_APPEND_FL FS_APPEND_FL /* writes to file may only append */
|
||||
#define EXT2_NODUMP_FL FS_NODUMP_FL /* do not dump file */
|
||||
#define EXT2_NOATIME_FL FS_NOATIME_FL /* do not update atime */
|
||||
/* Reserved for compression usage... */
|
||||
#define EXT2_DIRTY_FL FS_DIRTY_FL
|
||||
#define EXT2_COMPRBLK_FL FS_COMPRBLK_FL /* One or more compressed clusters */
|
||||
#define EXT2_NOCOMP_FL FS_NOCOMP_FL /* Don't compress */
|
||||
#define EXT2_ECOMPR_FL FS_ECOMPR_FL /* Compression error */
|
||||
/* End compression flags --- maybe not all used */
|
||||
#define EXT2_BTREE_FL FS_BTREE_FL /* btree format dir */
|
||||
#define EXT2_INDEX_FL FS_INDEX_FL /* hash-indexed directory */
|
||||
#define EXT2_IMAGIC_FL FS_IMAGIC_FL /* AFS directory */
|
||||
#define EXT2_JOURNAL_DATA_FL FS_JOURNAL_DATA_FL /* Reserved for ext3 */
|
||||
#define EXT2_NOTAIL_FL FS_NOTAIL_FL /* file tail should not be merged */
|
||||
#define EXT2_DIRSYNC_FL FS_DIRSYNC_FL /* dirsync behaviour (directories only) */
|
||||
#define EXT2_TOPDIR_FL FS_TOPDIR_FL /* Top of directory hierarchies*/
|
||||
#define EXT2_RESERVED_FL FS_RESERVED_FL /* reserved for ext2 lib */
|
||||
|
||||
#define EXT2_FL_USER_VISIBLE FS_FL_USER_VISIBLE /* User visible flags */
|
||||
#define EXT2_FL_USER_MODIFIABLE FS_FL_USER_MODIFIABLE /* User modifiable flags */
|
||||
|
||||
/* Flags that should be inherited by new inodes from their parent. */
|
||||
#define EXT2_FL_INHERITED (EXT2_SECRM_FL | EXT2_UNRM_FL | EXT2_COMPR_FL |\
|
||||
EXT2_SYNC_FL | EXT2_NODUMP_FL |\
|
||||
EXT2_NOATIME_FL | EXT2_COMPRBLK_FL |\
|
||||
EXT2_NOCOMP_FL | EXT2_JOURNAL_DATA_FL |\
|
||||
EXT2_NOTAIL_FL | EXT2_DIRSYNC_FL)
|
||||
|
||||
/* Flags that are appropriate for regular files (all but dir-specific ones). */
|
||||
#define EXT2_REG_FLMASK (~(EXT2_DIRSYNC_FL | EXT2_TOPDIR_FL))
|
||||
|
||||
/* Flags that are appropriate for non-directories/regular files. */
|
||||
#define EXT2_OTHER_FLMASK (EXT2_NODUMP_FL | EXT2_NOATIME_FL)
|
||||
|
||||
/* Mask out flags that are inappropriate for the given type of inode. */
|
||||
static inline __u32 ext2_mask_flags(umode_t mode, __u32 flags)
|
||||
{
|
||||
if (S_ISDIR(mode))
|
||||
return flags;
|
||||
else if (S_ISREG(mode))
|
||||
return flags & EXT2_REG_FLMASK;
|
||||
else
|
||||
return flags & EXT2_OTHER_FLMASK;
|
||||
__u8 *p = ext2_sb;
|
||||
if (*(__le16 *)(p + EXT2_SB_MAGIC_OFFSET) != cpu_to_le16(EXT2_SUPER_MAGIC))
|
||||
return 0;
|
||||
return (u64)le32_to_cpup((__le32 *)(p + EXT2_SB_BLOCKS_OFFSET)) <<
|
||||
le32_to_cpup((__le32 *)(p + EXT2_SB_BSIZE_OFFSET));
|
||||
}
|
||||
|
||||
/*
|
||||
* ioctl commands
|
||||
*/
|
||||
#define EXT2_IOC_GETFLAGS FS_IOC_GETFLAGS
|
||||
#define EXT2_IOC_SETFLAGS FS_IOC_SETFLAGS
|
||||
#define EXT2_IOC_GETVERSION FS_IOC_GETVERSION
|
||||
#define EXT2_IOC_SETVERSION FS_IOC_SETVERSION
|
||||
#define EXT2_IOC_GETRSVSZ _IOR('f', 5, long)
|
||||
#define EXT2_IOC_SETRSVSZ _IOW('f', 6, long)
|
||||
|
||||
/*
|
||||
* ioctl commands in 32 bit emulation
|
||||
*/
|
||||
#define EXT2_IOC32_GETFLAGS FS_IOC32_GETFLAGS
|
||||
#define EXT2_IOC32_SETFLAGS FS_IOC32_SETFLAGS
|
||||
#define EXT2_IOC32_GETVERSION FS_IOC32_GETVERSION
|
||||
#define EXT2_IOC32_SETVERSION FS_IOC32_SETVERSION
|
||||
|
||||
/*
|
||||
* Structure of an inode on the disk
|
||||
*/
|
||||
struct ext2_inode {
|
||||
__le16 i_mode; /* File mode */
|
||||
__le16 i_uid; /* Low 16 bits of Owner Uid */
|
||||
__le32 i_size; /* Size in bytes */
|
||||
__le32 i_atime; /* Access time */
|
||||
__le32 i_ctime; /* Creation time */
|
||||
__le32 i_mtime; /* Modification time */
|
||||
__le32 i_dtime; /* Deletion Time */
|
||||
__le16 i_gid; /* Low 16 bits of Group Id */
|
||||
__le16 i_links_count; /* Links count */
|
||||
__le32 i_blocks; /* Blocks count */
|
||||
__le32 i_flags; /* File flags */
|
||||
union {
|
||||
struct {
|
||||
__le32 l_i_reserved1;
|
||||
} linux1;
|
||||
struct {
|
||||
__le32 h_i_translator;
|
||||
} hurd1;
|
||||
struct {
|
||||
__le32 m_i_reserved1;
|
||||
} masix1;
|
||||
} osd1; /* OS dependent 1 */
|
||||
__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
|
||||
__le32 i_generation; /* File version (for NFS) */
|
||||
__le32 i_file_acl; /* File ACL */
|
||||
__le32 i_dir_acl; /* Directory ACL */
|
||||
__le32 i_faddr; /* Fragment address */
|
||||
union {
|
||||
struct {
|
||||
__u8 l_i_frag; /* Fragment number */
|
||||
__u8 l_i_fsize; /* Fragment size */
|
||||
__u16 i_pad1;
|
||||
__le16 l_i_uid_high; /* these 2 fields */
|
||||
__le16 l_i_gid_high; /* were reserved2[0] */
|
||||
__u32 l_i_reserved2;
|
||||
} linux2;
|
||||
struct {
|
||||
__u8 h_i_frag; /* Fragment number */
|
||||
__u8 h_i_fsize; /* Fragment size */
|
||||
__le16 h_i_mode_high;
|
||||
__le16 h_i_uid_high;
|
||||
__le16 h_i_gid_high;
|
||||
__le32 h_i_author;
|
||||
} hurd2;
|
||||
struct {
|
||||
__u8 m_i_frag; /* Fragment number */
|
||||
__u8 m_i_fsize; /* Fragment size */
|
||||
__u16 m_pad1;
|
||||
__u32 m_i_reserved2[2];
|
||||
} masix2;
|
||||
} osd2; /* OS dependent 2 */
|
||||
};
|
||||
|
||||
#define i_size_high i_dir_acl
|
||||
|
||||
#if defined(__KERNEL__) || defined(__linux__)
|
||||
#define i_reserved1 osd1.linux1.l_i_reserved1
|
||||
#define i_frag osd2.linux2.l_i_frag
|
||||
#define i_fsize osd2.linux2.l_i_fsize
|
||||
#define i_uid_low i_uid
|
||||
#define i_gid_low i_gid
|
||||
#define i_uid_high osd2.linux2.l_i_uid_high
|
||||
#define i_gid_high osd2.linux2.l_i_gid_high
|
||||
#define i_reserved2 osd2.linux2.l_i_reserved2
|
||||
#endif
|
||||
|
||||
#ifdef __hurd__
|
||||
#define i_translator osd1.hurd1.h_i_translator
|
||||
#define i_frag osd2.hurd2.h_i_frag
|
||||
#define i_fsize osd2.hurd2.h_i_fsize
|
||||
#define i_uid_high osd2.hurd2.h_i_uid_high
|
||||
#define i_gid_high osd2.hurd2.h_i_gid_high
|
||||
#define i_author osd2.hurd2.h_i_author
|
||||
#endif
|
||||
|
||||
#ifdef __masix__
|
||||
#define i_reserved1 osd1.masix1.m_i_reserved1
|
||||
#define i_frag osd2.masix2.m_i_frag
|
||||
#define i_fsize osd2.masix2.m_i_fsize
|
||||
#define i_reserved2 osd2.masix2.m_i_reserved2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* File system states
|
||||
*/
|
||||
#define EXT2_VALID_FS 0x0001 /* Unmounted cleanly */
|
||||
#define EXT2_ERROR_FS 0x0002 /* Errors detected */
|
||||
|
||||
/*
|
||||
* Mount flags
|
||||
*/
|
||||
#define EXT2_MOUNT_CHECK 0x000001 /* Do mount-time checks */
|
||||
#define EXT2_MOUNT_OLDALLOC 0x000002 /* Don't use the new Orlov allocator */
|
||||
#define EXT2_MOUNT_GRPID 0x000004 /* Create files with directory's group */
|
||||
#define EXT2_MOUNT_DEBUG 0x000008 /* Some debugging messages */
|
||||
#define EXT2_MOUNT_ERRORS_CONT 0x000010 /* Continue on errors */
|
||||
#define EXT2_MOUNT_ERRORS_RO 0x000020 /* Remount fs ro on errors */
|
||||
#define EXT2_MOUNT_ERRORS_PANIC 0x000040 /* Panic on errors */
|
||||
#define EXT2_MOUNT_MINIX_DF 0x000080 /* Mimics the Minix statfs */
|
||||
#define EXT2_MOUNT_NOBH 0x000100 /* No buffer_heads */
|
||||
#define EXT2_MOUNT_NO_UID32 0x000200 /* Disable 32-bit UIDs */
|
||||
#define EXT2_MOUNT_XATTR_USER 0x004000 /* Extended user attributes */
|
||||
#define EXT2_MOUNT_POSIX_ACL 0x008000 /* POSIX Access Control Lists */
|
||||
#define EXT2_MOUNT_XIP 0x010000 /* Execute in place */
|
||||
#define EXT2_MOUNT_USRQUOTA 0x020000 /* user quota */
|
||||
#define EXT2_MOUNT_GRPQUOTA 0x040000 /* group quota */
|
||||
#define EXT2_MOUNT_RESERVATION 0x080000 /* Preallocation */
|
||||
|
||||
|
||||
#define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt
|
||||
#define set_opt(o, opt) o |= EXT2_MOUNT_##opt
|
||||
#define test_opt(sb, opt) (EXT2_SB(sb)->s_mount_opt & \
|
||||
EXT2_MOUNT_##opt)
|
||||
/*
|
||||
* Maximal mount counts between two filesystem checks
|
||||
*/
|
||||
#define EXT2_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */
|
||||
#define EXT2_DFL_CHECKINTERVAL 0 /* Don't use interval check */
|
||||
|
||||
/*
|
||||
* Behaviour when detecting errors
|
||||
*/
|
||||
#define EXT2_ERRORS_CONTINUE 1 /* Continue execution */
|
||||
#define EXT2_ERRORS_RO 2 /* Remount fs read-only */
|
||||
#define EXT2_ERRORS_PANIC 3 /* Panic */
|
||||
#define EXT2_ERRORS_DEFAULT EXT2_ERRORS_CONTINUE
|
||||
|
||||
/*
|
||||
* Structure of the super block
|
||||
*/
|
||||
struct ext2_super_block {
|
||||
__le32 s_inodes_count; /* Inodes count */
|
||||
__le32 s_blocks_count; /* Blocks count */
|
||||
__le32 s_r_blocks_count; /* Reserved blocks count */
|
||||
__le32 s_free_blocks_count; /* Free blocks count */
|
||||
__le32 s_free_inodes_count; /* Free inodes count */
|
||||
__le32 s_first_data_block; /* First Data Block */
|
||||
__le32 s_log_block_size; /* Block size */
|
||||
__le32 s_log_frag_size; /* Fragment size */
|
||||
__le32 s_blocks_per_group; /* # Blocks per group */
|
||||
__le32 s_frags_per_group; /* # Fragments per group */
|
||||
__le32 s_inodes_per_group; /* # Inodes per group */
|
||||
__le32 s_mtime; /* Mount time */
|
||||
__le32 s_wtime; /* Write time */
|
||||
__le16 s_mnt_count; /* Mount count */
|
||||
__le16 s_max_mnt_count; /* Maximal mount count */
|
||||
__le16 s_magic; /* Magic signature */
|
||||
__le16 s_state; /* File system state */
|
||||
__le16 s_errors; /* Behaviour when detecting errors */
|
||||
__le16 s_minor_rev_level; /* minor revision level */
|
||||
__le32 s_lastcheck; /* time of last check */
|
||||
__le32 s_checkinterval; /* max. time between checks */
|
||||
__le32 s_creator_os; /* OS */
|
||||
__le32 s_rev_level; /* Revision level */
|
||||
__le16 s_def_resuid; /* Default uid for reserved blocks */
|
||||
__le16 s_def_resgid; /* Default gid for reserved blocks */
|
||||
/*
|
||||
* These fields are for EXT2_DYNAMIC_REV superblocks only.
|
||||
*
|
||||
* Note: the difference between the compatible feature set and
|
||||
* the incompatible feature set is that if there is a bit set
|
||||
* in the incompatible feature set that the kernel doesn't
|
||||
* know about, it should refuse to mount the filesystem.
|
||||
*
|
||||
* e2fsck's requirements are more strict; if it doesn't know
|
||||
* about a feature in either the compatible or incompatible
|
||||
* feature set, it must abort and not try to meddle with
|
||||
* things it doesn't understand...
|
||||
*/
|
||||
__le32 s_first_ino; /* First non-reserved inode */
|
||||
__le16 s_inode_size; /* size of inode structure */
|
||||
__le16 s_block_group_nr; /* block group # of this superblock */
|
||||
__le32 s_feature_compat; /* compatible feature set */
|
||||
__le32 s_feature_incompat; /* incompatible feature set */
|
||||
__le32 s_feature_ro_compat; /* readonly-compatible feature set */
|
||||
__u8 s_uuid[16]; /* 128-bit uuid for volume */
|
||||
char s_volume_name[16]; /* volume name */
|
||||
char s_last_mounted[64]; /* directory where last mounted */
|
||||
__le32 s_algorithm_usage_bitmap; /* For compression */
|
||||
/*
|
||||
* Performance hints. Directory preallocation should only
|
||||
* happen if the EXT2_COMPAT_PREALLOC flag is on.
|
||||
*/
|
||||
__u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
|
||||
__u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
|
||||
__u16 s_padding1;
|
||||
/*
|
||||
* Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
|
||||
*/
|
||||
__u8 s_journal_uuid[16]; /* uuid of journal superblock */
|
||||
__u32 s_journal_inum; /* inode number of journal file */
|
||||
__u32 s_journal_dev; /* device number of journal file */
|
||||
__u32 s_last_orphan; /* start of list of inodes to delete */
|
||||
__u32 s_hash_seed[4]; /* HTREE hash seed */
|
||||
__u8 s_def_hash_version; /* Default hash version to use */
|
||||
__u8 s_reserved_char_pad;
|
||||
__u16 s_reserved_word_pad;
|
||||
__le32 s_default_mount_opts;
|
||||
__le32 s_first_meta_bg; /* First metablock block group */
|
||||
__u32 s_reserved[190]; /* Padding to the end of the block */
|
||||
};
|
||||
|
||||
/*
|
||||
* Codes for operating systems
|
||||
*/
|
||||
#define EXT2_OS_LINUX 0
|
||||
#define EXT2_OS_HURD 1
|
||||
#define EXT2_OS_MASIX 2
|
||||
#define EXT2_OS_FREEBSD 3
|
||||
#define EXT2_OS_LITES 4
|
||||
|
||||
/*
|
||||
* Revision levels
|
||||
*/
|
||||
#define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */
|
||||
#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */
|
||||
|
||||
#define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV
|
||||
#define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV
|
||||
|
||||
#define EXT2_GOOD_OLD_INODE_SIZE 128
|
||||
|
||||
/*
|
||||
* Feature set definitions
|
||||
*/
|
||||
|
||||
#define EXT2_HAS_COMPAT_FEATURE(sb,mask) \
|
||||
( EXT2_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) )
|
||||
#define EXT2_HAS_RO_COMPAT_FEATURE(sb,mask) \
|
||||
( EXT2_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) )
|
||||
#define EXT2_HAS_INCOMPAT_FEATURE(sb,mask) \
|
||||
( EXT2_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) )
|
||||
#define EXT2_SET_COMPAT_FEATURE(sb,mask) \
|
||||
EXT2_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask)
|
||||
#define EXT2_SET_RO_COMPAT_FEATURE(sb,mask) \
|
||||
EXT2_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask)
|
||||
#define EXT2_SET_INCOMPAT_FEATURE(sb,mask) \
|
||||
EXT2_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask)
|
||||
#define EXT2_CLEAR_COMPAT_FEATURE(sb,mask) \
|
||||
EXT2_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask)
|
||||
#define EXT2_CLEAR_RO_COMPAT_FEATURE(sb,mask) \
|
||||
EXT2_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask)
|
||||
#define EXT2_CLEAR_INCOMPAT_FEATURE(sb,mask) \
|
||||
EXT2_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask)
|
||||
|
||||
#define EXT2_FEATURE_COMPAT_DIR_PREALLOC 0x0001
|
||||
#define EXT2_FEATURE_COMPAT_IMAGIC_INODES 0x0002
|
||||
#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
|
||||
#define EXT2_FEATURE_COMPAT_EXT_ATTR 0x0008
|
||||
#define EXT2_FEATURE_COMPAT_RESIZE_INO 0x0010
|
||||
#define EXT2_FEATURE_COMPAT_DIR_INDEX 0x0020
|
||||
#define EXT2_FEATURE_COMPAT_ANY 0xffffffff
|
||||
|
||||
#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
|
||||
#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
|
||||
#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
|
||||
#define EXT2_FEATURE_RO_COMPAT_ANY 0xffffffff
|
||||
|
||||
#define EXT2_FEATURE_INCOMPAT_COMPRESSION 0x0001
|
||||
#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002
|
||||
#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004
|
||||
#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008
|
||||
#define EXT2_FEATURE_INCOMPAT_META_BG 0x0010
|
||||
#define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff
|
||||
|
||||
#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR
|
||||
#define EXT2_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE| \
|
||||
EXT2_FEATURE_INCOMPAT_META_BG)
|
||||
#define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
|
||||
EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
|
||||
EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
|
||||
#define EXT2_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT2_FEATURE_RO_COMPAT_SUPP
|
||||
#define EXT2_FEATURE_INCOMPAT_UNSUPPORTED ~EXT2_FEATURE_INCOMPAT_SUPP
|
||||
|
||||
/*
|
||||
* Default values for user and/or group using reserved blocks
|
||||
*/
|
||||
#define EXT2_DEF_RESUID 0
|
||||
#define EXT2_DEF_RESGID 0
|
||||
|
||||
/*
|
||||
* Default mount options
|
||||
*/
|
||||
#define EXT2_DEFM_DEBUG 0x0001
|
||||
#define EXT2_DEFM_BSDGROUPS 0x0002
|
||||
#define EXT2_DEFM_XATTR_USER 0x0004
|
||||
#define EXT2_DEFM_ACL 0x0008
|
||||
#define EXT2_DEFM_UID16 0x0010
|
||||
/* Not used by ext2, but reserved for use by ext3 */
|
||||
#define EXT3_DEFM_JMODE 0x0060
|
||||
#define EXT3_DEFM_JMODE_DATA 0x0020
|
||||
#define EXT3_DEFM_JMODE_ORDERED 0x0040
|
||||
#define EXT3_DEFM_JMODE_WBACK 0x0060
|
||||
|
||||
/*
|
||||
* Structure of a directory entry
|
||||
*/
|
||||
#define EXT2_NAME_LEN 255
|
||||
|
||||
struct ext2_dir_entry {
|
||||
__le32 inode; /* Inode number */
|
||||
__le16 rec_len; /* Directory entry length */
|
||||
__le16 name_len; /* Name length */
|
||||
char name[EXT2_NAME_LEN]; /* File name */
|
||||
};
|
||||
|
||||
/*
|
||||
* The new version of the directory entry. Since EXT2 structures are
|
||||
* stored in intel byte order, and the name_len field could never be
|
||||
* bigger than 255 chars, it's safe to reclaim the extra byte for the
|
||||
* file_type field.
|
||||
*/
|
||||
struct ext2_dir_entry_2 {
|
||||
__le32 inode; /* Inode number */
|
||||
__le16 rec_len; /* Directory entry length */
|
||||
__u8 name_len; /* Name length */
|
||||
__u8 file_type;
|
||||
char name[EXT2_NAME_LEN]; /* File name */
|
||||
};
|
||||
|
||||
/*
|
||||
* Ext2 directory file types. Only the low 3 bits are used. The
|
||||
* other bits are reserved for now.
|
||||
*/
|
||||
enum {
|
||||
EXT2_FT_UNKNOWN = 0,
|
||||
EXT2_FT_REG_FILE = 1,
|
||||
EXT2_FT_DIR = 2,
|
||||
EXT2_FT_CHRDEV = 3,
|
||||
EXT2_FT_BLKDEV = 4,
|
||||
EXT2_FT_FIFO = 5,
|
||||
EXT2_FT_SOCK = 6,
|
||||
EXT2_FT_SYMLINK = 7,
|
||||
EXT2_FT_MAX
|
||||
};
|
||||
|
||||
/*
|
||||
* EXT2_DIR_PAD defines the directory entries boundaries
|
||||
*
|
||||
* NOTE: It must be a multiple of 4
|
||||
*/
|
||||
#define EXT2_DIR_PAD 4
|
||||
#define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1)
|
||||
#define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \
|
||||
~EXT2_DIR_ROUND)
|
||||
#define EXT2_MAX_REC_LEN ((1<<16)-1)
|
||||
|
||||
#endif /* _LINUX_EXT2_FS_H */
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
/*
|
||||
* linux/include/linux/ext2_fs_sb.h
|
||||
*
|
||||
* Copyright (C) 1992, 1993, 1994, 1995
|
||||
* Remy Card (card@masi.ibp.fr)
|
||||
* Laboratoire MASI - Institut Blaise Pascal
|
||||
* Universite Pierre et Marie Curie (Paris VI)
|
||||
*
|
||||
* from
|
||||
*
|
||||
* linux/include/linux/minix_fs_sb.h
|
||||
*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_EXT2_FS_SB
|
||||
#define _LINUX_EXT2_FS_SB
|
||||
|
||||
#include <linux/blockgroup_lock.h>
|
||||
#include <linux/percpu_counter.h>
|
||||
#include <linux/rbtree.h>
|
||||
|
||||
/* XXX Here for now... not interested in restructing headers JUST now */
|
||||
|
||||
/* data type for block offset of block group */
|
||||
typedef int ext2_grpblk_t;
|
||||
|
||||
/* data type for filesystem-wide blocks number */
|
||||
typedef unsigned long ext2_fsblk_t;
|
||||
|
||||
#define E2FSBLK "%lu"
|
||||
|
||||
struct ext2_reserve_window {
|
||||
ext2_fsblk_t _rsv_start; /* First byte reserved */
|
||||
ext2_fsblk_t _rsv_end; /* Last byte reserved or 0 */
|
||||
};
|
||||
|
||||
struct ext2_reserve_window_node {
|
||||
struct rb_node rsv_node;
|
||||
__u32 rsv_goal_size;
|
||||
__u32 rsv_alloc_hit;
|
||||
struct ext2_reserve_window rsv_window;
|
||||
};
|
||||
|
||||
struct ext2_block_alloc_info {
|
||||
/* information about reservation window */
|
||||
struct ext2_reserve_window_node rsv_window_node;
|
||||
/*
|
||||
* was i_next_alloc_block in ext2_inode_info
|
||||
* is the logical (file-relative) number of the
|
||||
* most-recently-allocated block in this file.
|
||||
* We use this for detecting linearly ascending allocation requests.
|
||||
*/
|
||||
__u32 last_alloc_logical_block;
|
||||
/*
|
||||
* Was i_next_alloc_goal in ext2_inode_info
|
||||
* is the *physical* companion to i_next_alloc_block.
|
||||
* it the the physical block number of the block which was most-recentl
|
||||
* allocated to this file. This give us the goal (target) for the next
|
||||
* allocation when we detect linearly ascending requests.
|
||||
*/
|
||||
ext2_fsblk_t last_alloc_physical_block;
|
||||
};
|
||||
|
||||
#define rsv_start rsv_window._rsv_start
|
||||
#define rsv_end rsv_window._rsv_end
|
||||
|
||||
/*
|
||||
* second extended-fs super-block data in memory
|
||||
*/
|
||||
struct ext2_sb_info {
|
||||
unsigned long s_frag_size; /* Size of a fragment in bytes */
|
||||
unsigned long s_frags_per_block;/* Number of fragments per block */
|
||||
unsigned long s_inodes_per_block;/* Number of inodes per block */
|
||||
unsigned long s_frags_per_group;/* Number of fragments in a group */
|
||||
unsigned long s_blocks_per_group;/* Number of blocks in a group */
|
||||
unsigned long s_inodes_per_group;/* Number of inodes in a group */
|
||||
unsigned long s_itb_per_group; /* Number of inode table blocks per group */
|
||||
unsigned long s_gdb_count; /* Number of group descriptor blocks */
|
||||
unsigned long s_desc_per_block; /* Number of group descriptors per block */
|
||||
unsigned long s_groups_count; /* Number of groups in the fs */
|
||||
unsigned long s_overhead_last; /* Last calculated overhead */
|
||||
unsigned long s_blocks_last; /* Last seen block count */
|
||||
struct buffer_head * s_sbh; /* Buffer containing the super block */
|
||||
struct ext2_super_block * s_es; /* Pointer to the super block in the buffer */
|
||||
struct buffer_head ** s_group_desc;
|
||||
unsigned long s_mount_opt;
|
||||
unsigned long s_sb_block;
|
||||
uid_t s_resuid;
|
||||
gid_t s_resgid;
|
||||
unsigned short s_mount_state;
|
||||
unsigned short s_pad;
|
||||
int s_addr_per_block_bits;
|
||||
int s_desc_per_block_bits;
|
||||
int s_inode_size;
|
||||
int s_first_ino;
|
||||
spinlock_t s_next_gen_lock;
|
||||
u32 s_next_generation;
|
||||
unsigned long s_dir_count;
|
||||
u8 *s_debts;
|
||||
struct percpu_counter s_freeblocks_counter;
|
||||
struct percpu_counter s_freeinodes_counter;
|
||||
struct percpu_counter s_dirs_counter;
|
||||
struct blockgroup_lock *s_blockgroup_lock;
|
||||
/* root of the per fs reservation window tree */
|
||||
spinlock_t s_rsv_window_lock;
|
||||
struct rb_root s_rsv_window_root;
|
||||
struct ext2_reserve_window_node s_rsv_window_head;
|
||||
/*
|
||||
* s_lock protects against concurrent modifications of s_mount_state,
|
||||
* s_blocks_last, s_overhead_last and the content of superblock's
|
||||
* buffer pointed to by sbi->s_es.
|
||||
*
|
||||
* Note: It is used in ext2_show_options() to provide a consistent view
|
||||
* of the mount options.
|
||||
*/
|
||||
spinlock_t s_lock;
|
||||
};
|
||||
|
||||
static inline spinlock_t *
|
||||
sb_bgl_lock(struct ext2_sb_info *sbi, unsigned int block_group)
|
||||
{
|
||||
return bgl_lock_ptr(sbi->s_blockgroup_lock, block_group);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_EXT2_FS_SB */
|
||||
@@ -1,980 +0,0 @@
|
||||
/*
|
||||
* linux/include/linux/ext3_fs.h
|
||||
*
|
||||
* Copyright (C) 1992, 1993, 1994, 1995
|
||||
* Remy Card (card@masi.ibp.fr)
|
||||
* Laboratoire MASI - Institut Blaise Pascal
|
||||
* Universite Pierre et Marie Curie (Paris VI)
|
||||
*
|
||||
* from
|
||||
*
|
||||
* linux/include/linux/minix_fs.h
|
||||
*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_EXT3_FS_H
|
||||
#define _LINUX_EXT3_FS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/magic.h>
|
||||
#include <linux/bug.h>
|
||||
|
||||
/*
|
||||
* The second extended filesystem constants/structures
|
||||
*/
|
||||
|
||||
/*
|
||||
* Define EXT3FS_DEBUG to produce debug messages
|
||||
*/
|
||||
#undef EXT3FS_DEBUG
|
||||
|
||||
/*
|
||||
* Define EXT3_RESERVATION to reserve data blocks for expanding files
|
||||
*/
|
||||
#define EXT3_DEFAULT_RESERVE_BLOCKS 8
|
||||
/*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */
|
||||
#define EXT3_MAX_RESERVE_BLOCKS 1027
|
||||
#define EXT3_RESERVE_WINDOW_NOT_ALLOCATED 0
|
||||
|
||||
/*
|
||||
* Debug code
|
||||
*/
|
||||
#ifdef EXT3FS_DEBUG
|
||||
#define ext3_debug(f, a...) \
|
||||
do { \
|
||||
printk (KERN_DEBUG "EXT3-fs DEBUG (%s, %d): %s:", \
|
||||
__FILE__, __LINE__, __func__); \
|
||||
printk (KERN_DEBUG f, ## a); \
|
||||
} while (0)
|
||||
#else
|
||||
#define ext3_debug(f, a...) do {} while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Special inodes numbers
|
||||
*/
|
||||
#define EXT3_BAD_INO 1 /* Bad blocks inode */
|
||||
#define EXT3_ROOT_INO 2 /* Root inode */
|
||||
#define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */
|
||||
#define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */
|
||||
#define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */
|
||||
#define EXT3_JOURNAL_INO 8 /* Journal inode */
|
||||
|
||||
/* First non-reserved inode for old ext3 filesystems */
|
||||
#define EXT3_GOOD_OLD_FIRST_INO 11
|
||||
|
||||
/*
|
||||
* Maximal count of links to a file
|
||||
*/
|
||||
#define EXT3_LINK_MAX 32000
|
||||
|
||||
/*
|
||||
* Macro-instructions used to manage several block sizes
|
||||
*/
|
||||
#define EXT3_MIN_BLOCK_SIZE 1024
|
||||
#define EXT3_MAX_BLOCK_SIZE 65536
|
||||
#define EXT3_MIN_BLOCK_LOG_SIZE 10
|
||||
#ifdef __KERNEL__
|
||||
# define EXT3_BLOCK_SIZE(s) ((s)->s_blocksize)
|
||||
#else
|
||||
# define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size)
|
||||
#endif
|
||||
#define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32))
|
||||
#ifdef __KERNEL__
|
||||
# define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits)
|
||||
#else
|
||||
# define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10)
|
||||
#endif
|
||||
#ifdef __KERNEL__
|
||||
#define EXT3_ADDR_PER_BLOCK_BITS(s) (EXT3_SB(s)->s_addr_per_block_bits)
|
||||
#define EXT3_INODE_SIZE(s) (EXT3_SB(s)->s_inode_size)
|
||||
#define EXT3_FIRST_INO(s) (EXT3_SB(s)->s_first_ino)
|
||||
#else
|
||||
#define EXT3_INODE_SIZE(s) (((s)->s_rev_level == EXT3_GOOD_OLD_REV) ? \
|
||||
EXT3_GOOD_OLD_INODE_SIZE : \
|
||||
(s)->s_inode_size)
|
||||
#define EXT3_FIRST_INO(s) (((s)->s_rev_level == EXT3_GOOD_OLD_REV) ? \
|
||||
EXT3_GOOD_OLD_FIRST_INO : \
|
||||
(s)->s_first_ino)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Macro-instructions used to manage fragments
|
||||
*/
|
||||
#define EXT3_MIN_FRAG_SIZE 1024
|
||||
#define EXT3_MAX_FRAG_SIZE 4096
|
||||
#define EXT3_MIN_FRAG_LOG_SIZE 10
|
||||
#ifdef __KERNEL__
|
||||
# define EXT3_FRAG_SIZE(s) (EXT3_SB(s)->s_frag_size)
|
||||
# define EXT3_FRAGS_PER_BLOCK(s) (EXT3_SB(s)->s_frags_per_block)
|
||||
#else
|
||||
# define EXT3_FRAG_SIZE(s) (EXT3_MIN_FRAG_SIZE << (s)->s_log_frag_size)
|
||||
# define EXT3_FRAGS_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / EXT3_FRAG_SIZE(s))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Structure of a blocks group descriptor
|
||||
*/
|
||||
struct ext3_group_desc
|
||||
{
|
||||
__le32 bg_block_bitmap; /* Blocks bitmap block */
|
||||
__le32 bg_inode_bitmap; /* Inodes bitmap block */
|
||||
__le32 bg_inode_table; /* Inodes table block */
|
||||
__le16 bg_free_blocks_count; /* Free blocks count */
|
||||
__le16 bg_free_inodes_count; /* Free inodes count */
|
||||
__le16 bg_used_dirs_count; /* Directories count */
|
||||
__u16 bg_pad;
|
||||
__le32 bg_reserved[3];
|
||||
};
|
||||
|
||||
/*
|
||||
* Macro-instructions used to manage group descriptors
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
# define EXT3_BLOCKS_PER_GROUP(s) (EXT3_SB(s)->s_blocks_per_group)
|
||||
# define EXT3_DESC_PER_BLOCK(s) (EXT3_SB(s)->s_desc_per_block)
|
||||
# define EXT3_INODES_PER_GROUP(s) (EXT3_SB(s)->s_inodes_per_group)
|
||||
# define EXT3_DESC_PER_BLOCK_BITS(s) (EXT3_SB(s)->s_desc_per_block_bits)
|
||||
#else
|
||||
# define EXT3_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group)
|
||||
# define EXT3_DESC_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_group_desc))
|
||||
# define EXT3_INODES_PER_GROUP(s) ((s)->s_inodes_per_group)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Constants relative to the data blocks
|
||||
*/
|
||||
#define EXT3_NDIR_BLOCKS 12
|
||||
#define EXT3_IND_BLOCK EXT3_NDIR_BLOCKS
|
||||
#define EXT3_DIND_BLOCK (EXT3_IND_BLOCK + 1)
|
||||
#define EXT3_TIND_BLOCK (EXT3_DIND_BLOCK + 1)
|
||||
#define EXT3_N_BLOCKS (EXT3_TIND_BLOCK + 1)
|
||||
|
||||
/*
|
||||
* Inode flags
|
||||
*/
|
||||
#define EXT3_SECRM_FL 0x00000001 /* Secure deletion */
|
||||
#define EXT3_UNRM_FL 0x00000002 /* Undelete */
|
||||
#define EXT3_COMPR_FL 0x00000004 /* Compress file */
|
||||
#define EXT3_SYNC_FL 0x00000008 /* Synchronous updates */
|
||||
#define EXT3_IMMUTABLE_FL 0x00000010 /* Immutable file */
|
||||
#define EXT3_APPEND_FL 0x00000020 /* writes to file may only append */
|
||||
#define EXT3_NODUMP_FL 0x00000040 /* do not dump file */
|
||||
#define EXT3_NOATIME_FL 0x00000080 /* do not update atime */
|
||||
/* Reserved for compression usage... */
|
||||
#define EXT3_DIRTY_FL 0x00000100
|
||||
#define EXT3_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */
|
||||
#define EXT3_NOCOMPR_FL 0x00000400 /* Don't compress */
|
||||
#define EXT3_ECOMPR_FL 0x00000800 /* Compression error */
|
||||
/* End compression flags --- maybe not all used */
|
||||
#define EXT3_INDEX_FL 0x00001000 /* hash-indexed directory */
|
||||
#define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */
|
||||
#define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */
|
||||
#define EXT3_NOTAIL_FL 0x00008000 /* file tail should not be merged */
|
||||
#define EXT3_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */
|
||||
#define EXT3_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/
|
||||
#define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */
|
||||
|
||||
#define EXT3_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */
|
||||
#define EXT3_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */
|
||||
|
||||
/* Flags that should be inherited by new inodes from their parent. */
|
||||
#define EXT3_FL_INHERITED (EXT3_SECRM_FL | EXT3_UNRM_FL | EXT3_COMPR_FL |\
|
||||
EXT3_SYNC_FL | EXT3_NODUMP_FL |\
|
||||
EXT3_NOATIME_FL | EXT3_COMPRBLK_FL |\
|
||||
EXT3_NOCOMPR_FL | EXT3_JOURNAL_DATA_FL |\
|
||||
EXT3_NOTAIL_FL | EXT3_DIRSYNC_FL)
|
||||
|
||||
/* Flags that are appropriate for regular files (all but dir-specific ones). */
|
||||
#define EXT3_REG_FLMASK (~(EXT3_DIRSYNC_FL | EXT3_TOPDIR_FL))
|
||||
|
||||
/* Flags that are appropriate for non-directories/regular files. */
|
||||
#define EXT3_OTHER_FLMASK (EXT3_NODUMP_FL | EXT3_NOATIME_FL)
|
||||
|
||||
/* Mask out flags that are inappropriate for the given type of inode. */
|
||||
static inline __u32 ext3_mask_flags(umode_t mode, __u32 flags)
|
||||
{
|
||||
if (S_ISDIR(mode))
|
||||
return flags;
|
||||
else if (S_ISREG(mode))
|
||||
return flags & EXT3_REG_FLMASK;
|
||||
else
|
||||
return flags & EXT3_OTHER_FLMASK;
|
||||
}
|
||||
|
||||
/* Used to pass group descriptor data when online resize is done */
|
||||
struct ext3_new_group_input {
|
||||
__u32 group; /* Group number for this data */
|
||||
__u32 block_bitmap; /* Absolute block number of block bitmap */
|
||||
__u32 inode_bitmap; /* Absolute block number of inode bitmap */
|
||||
__u32 inode_table; /* Absolute block number of inode table start */
|
||||
__u32 blocks_count; /* Total number of blocks in this group */
|
||||
__u16 reserved_blocks; /* Number of reserved blocks in this group */
|
||||
__u16 unused;
|
||||
};
|
||||
|
||||
/* The struct ext3_new_group_input in kernel space, with free_blocks_count */
|
||||
struct ext3_new_group_data {
|
||||
__u32 group;
|
||||
__u32 block_bitmap;
|
||||
__u32 inode_bitmap;
|
||||
__u32 inode_table;
|
||||
__u32 blocks_count;
|
||||
__u16 reserved_blocks;
|
||||
__u16 unused;
|
||||
__u32 free_blocks_count;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* ioctl commands
|
||||
*/
|
||||
#define EXT3_IOC_GETFLAGS FS_IOC_GETFLAGS
|
||||
#define EXT3_IOC_SETFLAGS FS_IOC_SETFLAGS
|
||||
#define EXT3_IOC_GETVERSION _IOR('f', 3, long)
|
||||
#define EXT3_IOC_SETVERSION _IOW('f', 4, long)
|
||||
#define EXT3_IOC_GROUP_EXTEND _IOW('f', 7, unsigned long)
|
||||
#define EXT3_IOC_GROUP_ADD _IOW('f', 8,struct ext3_new_group_input)
|
||||
#define EXT3_IOC_GETVERSION_OLD FS_IOC_GETVERSION
|
||||
#define EXT3_IOC_SETVERSION_OLD FS_IOC_SETVERSION
|
||||
#ifdef CONFIG_JBD_DEBUG
|
||||
#define EXT3_IOC_WAIT_FOR_READONLY _IOR('f', 99, long)
|
||||
#endif
|
||||
#define EXT3_IOC_GETRSVSZ _IOR('f', 5, long)
|
||||
#define EXT3_IOC_SETRSVSZ _IOW('f', 6, long)
|
||||
|
||||
/*
|
||||
* ioctl commands in 32 bit emulation
|
||||
*/
|
||||
#define EXT3_IOC32_GETFLAGS FS_IOC32_GETFLAGS
|
||||
#define EXT3_IOC32_SETFLAGS FS_IOC32_SETFLAGS
|
||||
#define EXT3_IOC32_GETVERSION _IOR('f', 3, int)
|
||||
#define EXT3_IOC32_SETVERSION _IOW('f', 4, int)
|
||||
#define EXT3_IOC32_GETRSVSZ _IOR('f', 5, int)
|
||||
#define EXT3_IOC32_SETRSVSZ _IOW('f', 6, int)
|
||||
#define EXT3_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int)
|
||||
#ifdef CONFIG_JBD_DEBUG
|
||||
#define EXT3_IOC32_WAIT_FOR_READONLY _IOR('f', 99, int)
|
||||
#endif
|
||||
#define EXT3_IOC32_GETVERSION_OLD FS_IOC32_GETVERSION
|
||||
#define EXT3_IOC32_SETVERSION_OLD FS_IOC32_SETVERSION
|
||||
|
||||
|
||||
/*
|
||||
* Mount options
|
||||
*/
|
||||
struct ext3_mount_options {
|
||||
unsigned long s_mount_opt;
|
||||
uid_t s_resuid;
|
||||
gid_t s_resgid;
|
||||
unsigned long s_commit_interval;
|
||||
#ifdef CONFIG_QUOTA
|
||||
int s_jquota_fmt;
|
||||
char *s_qf_names[MAXQUOTAS];
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
* Structure of an inode on the disk
|
||||
*/
|
||||
struct ext3_inode {
|
||||
__le16 i_mode; /* File mode */
|
||||
__le16 i_uid; /* Low 16 bits of Owner Uid */
|
||||
__le32 i_size; /* Size in bytes */
|
||||
__le32 i_atime; /* Access time */
|
||||
__le32 i_ctime; /* Creation time */
|
||||
__le32 i_mtime; /* Modification time */
|
||||
__le32 i_dtime; /* Deletion Time */
|
||||
__le16 i_gid; /* Low 16 bits of Group Id */
|
||||
__le16 i_links_count; /* Links count */
|
||||
__le32 i_blocks; /* Blocks count */
|
||||
__le32 i_flags; /* File flags */
|
||||
union {
|
||||
struct {
|
||||
__u32 l_i_reserved1;
|
||||
} linux1;
|
||||
struct {
|
||||
__u32 h_i_translator;
|
||||
} hurd1;
|
||||
struct {
|
||||
__u32 m_i_reserved1;
|
||||
} masix1;
|
||||
} osd1; /* OS dependent 1 */
|
||||
__le32 i_block[EXT3_N_BLOCKS];/* Pointers to blocks */
|
||||
__le32 i_generation; /* File version (for NFS) */
|
||||
__le32 i_file_acl; /* File ACL */
|
||||
__le32 i_dir_acl; /* Directory ACL */
|
||||
__le32 i_faddr; /* Fragment address */
|
||||
union {
|
||||
struct {
|
||||
__u8 l_i_frag; /* Fragment number */
|
||||
__u8 l_i_fsize; /* Fragment size */
|
||||
__u16 i_pad1;
|
||||
__le16 l_i_uid_high; /* these 2 fields */
|
||||
__le16 l_i_gid_high; /* were reserved2[0] */
|
||||
__u32 l_i_reserved2;
|
||||
} linux2;
|
||||
struct {
|
||||
__u8 h_i_frag; /* Fragment number */
|
||||
__u8 h_i_fsize; /* Fragment size */
|
||||
__u16 h_i_mode_high;
|
||||
__u16 h_i_uid_high;
|
||||
__u16 h_i_gid_high;
|
||||
__u32 h_i_author;
|
||||
} hurd2;
|
||||
struct {
|
||||
__u8 m_i_frag; /* Fragment number */
|
||||
__u8 m_i_fsize; /* Fragment size */
|
||||
__u16 m_pad1;
|
||||
__u32 m_i_reserved2[2];
|
||||
} masix2;
|
||||
} osd2; /* OS dependent 2 */
|
||||
__le16 i_extra_isize;
|
||||
__le16 i_pad1;
|
||||
};
|
||||
|
||||
#define i_size_high i_dir_acl
|
||||
|
||||
#if defined(__KERNEL__) || defined(__linux__)
|
||||
#define i_reserved1 osd1.linux1.l_i_reserved1
|
||||
#define i_frag osd2.linux2.l_i_frag
|
||||
#define i_fsize osd2.linux2.l_i_fsize
|
||||
#define i_uid_low i_uid
|
||||
#define i_gid_low i_gid
|
||||
#define i_uid_high osd2.linux2.l_i_uid_high
|
||||
#define i_gid_high osd2.linux2.l_i_gid_high
|
||||
#define i_reserved2 osd2.linux2.l_i_reserved2
|
||||
|
||||
#elif defined(__GNU__)
|
||||
|
||||
#define i_translator osd1.hurd1.h_i_translator
|
||||
#define i_frag osd2.hurd2.h_i_frag;
|
||||
#define i_fsize osd2.hurd2.h_i_fsize;
|
||||
#define i_uid_high osd2.hurd2.h_i_uid_high
|
||||
#define i_gid_high osd2.hurd2.h_i_gid_high
|
||||
#define i_author osd2.hurd2.h_i_author
|
||||
|
||||
#elif defined(__masix__)
|
||||
|
||||
#define i_reserved1 osd1.masix1.m_i_reserved1
|
||||
#define i_frag osd2.masix2.m_i_frag
|
||||
#define i_fsize osd2.masix2.m_i_fsize
|
||||
#define i_reserved2 osd2.masix2.m_i_reserved2
|
||||
|
||||
#endif /* defined(__KERNEL__) || defined(__linux__) */
|
||||
|
||||
/*
|
||||
* File system states
|
||||
*/
|
||||
#define EXT3_VALID_FS 0x0001 /* Unmounted cleanly */
|
||||
#define EXT3_ERROR_FS 0x0002 /* Errors detected */
|
||||
#define EXT3_ORPHAN_FS 0x0004 /* Orphans being recovered */
|
||||
|
||||
/*
|
||||
* Misc. filesystem flags
|
||||
*/
|
||||
#define EXT2_FLAGS_SIGNED_HASH 0x0001 /* Signed dirhash in use */
|
||||
#define EXT2_FLAGS_UNSIGNED_HASH 0x0002 /* Unsigned dirhash in use */
|
||||
#define EXT2_FLAGS_TEST_FILESYS 0x0004 /* to test development code */
|
||||
|
||||
/*
|
||||
* Mount flags
|
||||
*/
|
||||
#define EXT3_MOUNT_CHECK 0x00001 /* Do mount-time checks */
|
||||
/* EXT3_MOUNT_OLDALLOC was there */
|
||||
#define EXT3_MOUNT_GRPID 0x00004 /* Create files with directory's group */
|
||||
#define EXT3_MOUNT_DEBUG 0x00008 /* Some debugging messages */
|
||||
#define EXT3_MOUNT_ERRORS_CONT 0x00010 /* Continue on errors */
|
||||
#define EXT3_MOUNT_ERRORS_RO 0x00020 /* Remount fs ro on errors */
|
||||
#define EXT3_MOUNT_ERRORS_PANIC 0x00040 /* Panic on errors */
|
||||
#define EXT3_MOUNT_MINIX_DF 0x00080 /* Mimics the Minix statfs */
|
||||
#define EXT3_MOUNT_NOLOAD 0x00100 /* Don't use existing journal*/
|
||||
#define EXT3_MOUNT_ABORT 0x00200 /* Fatal error detected */
|
||||
#define EXT3_MOUNT_DATA_FLAGS 0x00C00 /* Mode for data writes: */
|
||||
#define EXT3_MOUNT_JOURNAL_DATA 0x00400 /* Write data to journal */
|
||||
#define EXT3_MOUNT_ORDERED_DATA 0x00800 /* Flush data before commit */
|
||||
#define EXT3_MOUNT_WRITEBACK_DATA 0x00C00 /* No data ordering */
|
||||
#define EXT3_MOUNT_UPDATE_JOURNAL 0x01000 /* Update the journal format */
|
||||
#define EXT3_MOUNT_NO_UID32 0x02000 /* Disable 32-bit UIDs */
|
||||
#define EXT3_MOUNT_XATTR_USER 0x04000 /* Extended user attributes */
|
||||
#define EXT3_MOUNT_POSIX_ACL 0x08000 /* POSIX Access Control Lists */
|
||||
#define EXT3_MOUNT_RESERVATION 0x10000 /* Preallocation */
|
||||
#define EXT3_MOUNT_BARRIER 0x20000 /* Use block barriers */
|
||||
#define EXT3_MOUNT_QUOTA 0x80000 /* Some quota option set */
|
||||
#define EXT3_MOUNT_USRQUOTA 0x100000 /* "old" user quota */
|
||||
#define EXT3_MOUNT_GRPQUOTA 0x200000 /* "old" group quota */
|
||||
#define EXT3_MOUNT_DATA_ERR_ABORT 0x400000 /* Abort on file data write
|
||||
* error in ordered mode */
|
||||
|
||||
/* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */
|
||||
#ifndef _LINUX_EXT2_FS_H
|
||||
#define clear_opt(o, opt) o &= ~EXT3_MOUNT_##opt
|
||||
#define set_opt(o, opt) o |= EXT3_MOUNT_##opt
|
||||
#define test_opt(sb, opt) (EXT3_SB(sb)->s_mount_opt & \
|
||||
EXT3_MOUNT_##opt)
|
||||
#else
|
||||
#define EXT2_MOUNT_NOLOAD EXT3_MOUNT_NOLOAD
|
||||
#define EXT2_MOUNT_ABORT EXT3_MOUNT_ABORT
|
||||
#define EXT2_MOUNT_DATA_FLAGS EXT3_MOUNT_DATA_FLAGS
|
||||
#endif
|
||||
|
||||
#define ext3_set_bit __set_bit_le
|
||||
#define ext3_set_bit_atomic ext2_set_bit_atomic
|
||||
#define ext3_clear_bit __clear_bit_le
|
||||
#define ext3_clear_bit_atomic ext2_clear_bit_atomic
|
||||
#define ext3_test_bit test_bit_le
|
||||
#define ext3_find_next_zero_bit find_next_zero_bit_le
|
||||
|
||||
/*
|
||||
* Maximal mount counts between two filesystem checks
|
||||
*/
|
||||
#define EXT3_DFL_MAX_MNT_COUNT 20 /* Allow 20 mounts */
|
||||
#define EXT3_DFL_CHECKINTERVAL 0 /* Don't use interval check */
|
||||
|
||||
/*
|
||||
* Behaviour when detecting errors
|
||||
*/
|
||||
#define EXT3_ERRORS_CONTINUE 1 /* Continue execution */
|
||||
#define EXT3_ERRORS_RO 2 /* Remount fs read-only */
|
||||
#define EXT3_ERRORS_PANIC 3 /* Panic */
|
||||
#define EXT3_ERRORS_DEFAULT EXT3_ERRORS_CONTINUE
|
||||
|
||||
/*
|
||||
* Structure of the super block
|
||||
*/
|
||||
struct ext3_super_block {
|
||||
/*00*/ __le32 s_inodes_count; /* Inodes count */
|
||||
__le32 s_blocks_count; /* Blocks count */
|
||||
__le32 s_r_blocks_count; /* Reserved blocks count */
|
||||
__le32 s_free_blocks_count; /* Free blocks count */
|
||||
/*10*/ __le32 s_free_inodes_count; /* Free inodes count */
|
||||
__le32 s_first_data_block; /* First Data Block */
|
||||
__le32 s_log_block_size; /* Block size */
|
||||
__le32 s_log_frag_size; /* Fragment size */
|
||||
/*20*/ __le32 s_blocks_per_group; /* # Blocks per group */
|
||||
__le32 s_frags_per_group; /* # Fragments per group */
|
||||
__le32 s_inodes_per_group; /* # Inodes per group */
|
||||
__le32 s_mtime; /* Mount time */
|
||||
/*30*/ __le32 s_wtime; /* Write time */
|
||||
__le16 s_mnt_count; /* Mount count */
|
||||
__le16 s_max_mnt_count; /* Maximal mount count */
|
||||
__le16 s_magic; /* Magic signature */
|
||||
__le16 s_state; /* File system state */
|
||||
__le16 s_errors; /* Behaviour when detecting errors */
|
||||
__le16 s_minor_rev_level; /* minor revision level */
|
||||
/*40*/ __le32 s_lastcheck; /* time of last check */
|
||||
__le32 s_checkinterval; /* max. time between checks */
|
||||
__le32 s_creator_os; /* OS */
|
||||
__le32 s_rev_level; /* Revision level */
|
||||
/*50*/ __le16 s_def_resuid; /* Default uid for reserved blocks */
|
||||
__le16 s_def_resgid; /* Default gid for reserved blocks */
|
||||
/*
|
||||
* These fields are for EXT3_DYNAMIC_REV superblocks only.
|
||||
*
|
||||
* Note: the difference between the compatible feature set and
|
||||
* the incompatible feature set is that if there is a bit set
|
||||
* in the incompatible feature set that the kernel doesn't
|
||||
* know about, it should refuse to mount the filesystem.
|
||||
*
|
||||
* e2fsck's requirements are more strict; if it doesn't know
|
||||
* about a feature in either the compatible or incompatible
|
||||
* feature set, it must abort and not try to meddle with
|
||||
* things it doesn't understand...
|
||||
*/
|
||||
__le32 s_first_ino; /* First non-reserved inode */
|
||||
__le16 s_inode_size; /* size of inode structure */
|
||||
__le16 s_block_group_nr; /* block group # of this superblock */
|
||||
__le32 s_feature_compat; /* compatible feature set */
|
||||
/*60*/ __le32 s_feature_incompat; /* incompatible feature set */
|
||||
__le32 s_feature_ro_compat; /* readonly-compatible feature set */
|
||||
/*68*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */
|
||||
/*78*/ char s_volume_name[16]; /* volume name */
|
||||
/*88*/ char s_last_mounted[64]; /* directory where last mounted */
|
||||
/*C8*/ __le32 s_algorithm_usage_bitmap; /* For compression */
|
||||
/*
|
||||
* Performance hints. Directory preallocation should only
|
||||
* happen if the EXT3_FEATURE_COMPAT_DIR_PREALLOC flag is on.
|
||||
*/
|
||||
__u8 s_prealloc_blocks; /* Nr of blocks to try to preallocate*/
|
||||
__u8 s_prealloc_dir_blocks; /* Nr to preallocate for dirs */
|
||||
__le16 s_reserved_gdt_blocks; /* Per group desc for online growth */
|
||||
/*
|
||||
* Journaling support valid if EXT3_FEATURE_COMPAT_HAS_JOURNAL set.
|
||||
*/
|
||||
/*D0*/ __u8 s_journal_uuid[16]; /* uuid of journal superblock */
|
||||
/*E0*/ __le32 s_journal_inum; /* inode number of journal file */
|
||||
__le32 s_journal_dev; /* device number of journal file */
|
||||
__le32 s_last_orphan; /* start of list of inodes to delete */
|
||||
__le32 s_hash_seed[4]; /* HTREE hash seed */
|
||||
__u8 s_def_hash_version; /* Default hash version to use */
|
||||
__u8 s_reserved_char_pad;
|
||||
__u16 s_reserved_word_pad;
|
||||
__le32 s_default_mount_opts;
|
||||
__le32 s_first_meta_bg; /* First metablock block group */
|
||||
__le32 s_mkfs_time; /* When the filesystem was created */
|
||||
__le32 s_jnl_blocks[17]; /* Backup of the journal inode */
|
||||
/* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */
|
||||
/*150*/ __le32 s_blocks_count_hi; /* Blocks count */
|
||||
__le32 s_r_blocks_count_hi; /* Reserved blocks count */
|
||||
__le32 s_free_blocks_count_hi; /* Free blocks count */
|
||||
__le16 s_min_extra_isize; /* All inodes have at least # bytes */
|
||||
__le16 s_want_extra_isize; /* New inodes should reserve # bytes */
|
||||
__le32 s_flags; /* Miscellaneous flags */
|
||||
__le16 s_raid_stride; /* RAID stride */
|
||||
__le16 s_mmp_interval; /* # seconds to wait in MMP checking */
|
||||
__le64 s_mmp_block; /* Block for multi-mount protection */
|
||||
__le32 s_raid_stripe_width; /* blocks on all data disks (N*stride)*/
|
||||
__u8 s_log_groups_per_flex; /* FLEX_BG group size */
|
||||
__u8 s_reserved_char_pad2;
|
||||
__le16 s_reserved_pad;
|
||||
__u32 s_reserved[162]; /* Padding to the end of the block */
|
||||
};
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/ext3_fs_i.h>
|
||||
#include <linux/ext3_fs_sb.h>
|
||||
static inline struct ext3_sb_info * EXT3_SB(struct super_block *sb)
|
||||
{
|
||||
return sb->s_fs_info;
|
||||
}
|
||||
static inline struct ext3_inode_info *EXT3_I(struct inode *inode)
|
||||
{
|
||||
return container_of(inode, struct ext3_inode_info, vfs_inode);
|
||||
}
|
||||
|
||||
static inline int ext3_valid_inum(struct super_block *sb, unsigned long ino)
|
||||
{
|
||||
return ino == EXT3_ROOT_INO ||
|
||||
ino == EXT3_JOURNAL_INO ||
|
||||
ino == EXT3_RESIZE_INO ||
|
||||
(ino >= EXT3_FIRST_INO(sb) &&
|
||||
ino <= le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count));
|
||||
}
|
||||
|
||||
/*
|
||||
* Inode dynamic state flags
|
||||
*/
|
||||
enum {
|
||||
EXT3_STATE_JDATA, /* journaled data exists */
|
||||
EXT3_STATE_NEW, /* inode is newly created */
|
||||
EXT3_STATE_XATTR, /* has in-inode xattrs */
|
||||
EXT3_STATE_FLUSH_ON_CLOSE, /* flush dirty pages on close */
|
||||
};
|
||||
|
||||
static inline int ext3_test_inode_state(struct inode *inode, int bit)
|
||||
{
|
||||
return test_bit(bit, &EXT3_I(inode)->i_state_flags);
|
||||
}
|
||||
|
||||
static inline void ext3_set_inode_state(struct inode *inode, int bit)
|
||||
{
|
||||
set_bit(bit, &EXT3_I(inode)->i_state_flags);
|
||||
}
|
||||
|
||||
static inline void ext3_clear_inode_state(struct inode *inode, int bit)
|
||||
{
|
||||
clear_bit(bit, &EXT3_I(inode)->i_state_flags);
|
||||
}
|
||||
#else
|
||||
/* Assume that user mode programs are passing in an ext3fs superblock, not
|
||||
* a kernel struct super_block. This will allow us to call the feature-test
|
||||
* macros from user land. */
|
||||
#define EXT3_SB(sb) (sb)
|
||||
#endif
|
||||
|
||||
#define NEXT_ORPHAN(inode) EXT3_I(inode)->i_dtime
|
||||
|
||||
/*
|
||||
* Codes for operating systems
|
||||
*/
|
||||
#define EXT3_OS_LINUX 0
|
||||
#define EXT3_OS_HURD 1
|
||||
#define EXT3_OS_MASIX 2
|
||||
#define EXT3_OS_FREEBSD 3
|
||||
#define EXT3_OS_LITES 4
|
||||
|
||||
/*
|
||||
* Revision levels
|
||||
*/
|
||||
#define EXT3_GOOD_OLD_REV 0 /* The good old (original) format */
|
||||
#define EXT3_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */
|
||||
|
||||
#define EXT3_CURRENT_REV EXT3_GOOD_OLD_REV
|
||||
#define EXT3_MAX_SUPP_REV EXT3_DYNAMIC_REV
|
||||
|
||||
#define EXT3_GOOD_OLD_INODE_SIZE 128
|
||||
|
||||
/*
|
||||
* Feature set definitions
|
||||
*/
|
||||
|
||||
#define EXT3_HAS_COMPAT_FEATURE(sb,mask) \
|
||||
( EXT3_SB(sb)->s_es->s_feature_compat & cpu_to_le32(mask) )
|
||||
#define EXT3_HAS_RO_COMPAT_FEATURE(sb,mask) \
|
||||
( EXT3_SB(sb)->s_es->s_feature_ro_compat & cpu_to_le32(mask) )
|
||||
#define EXT3_HAS_INCOMPAT_FEATURE(sb,mask) \
|
||||
( EXT3_SB(sb)->s_es->s_feature_incompat & cpu_to_le32(mask) )
|
||||
#define EXT3_SET_COMPAT_FEATURE(sb,mask) \
|
||||
EXT3_SB(sb)->s_es->s_feature_compat |= cpu_to_le32(mask)
|
||||
#define EXT3_SET_RO_COMPAT_FEATURE(sb,mask) \
|
||||
EXT3_SB(sb)->s_es->s_feature_ro_compat |= cpu_to_le32(mask)
|
||||
#define EXT3_SET_INCOMPAT_FEATURE(sb,mask) \
|
||||
EXT3_SB(sb)->s_es->s_feature_incompat |= cpu_to_le32(mask)
|
||||
#define EXT3_CLEAR_COMPAT_FEATURE(sb,mask) \
|
||||
EXT3_SB(sb)->s_es->s_feature_compat &= ~cpu_to_le32(mask)
|
||||
#define EXT3_CLEAR_RO_COMPAT_FEATURE(sb,mask) \
|
||||
EXT3_SB(sb)->s_es->s_feature_ro_compat &= ~cpu_to_le32(mask)
|
||||
#define EXT3_CLEAR_INCOMPAT_FEATURE(sb,mask) \
|
||||
EXT3_SB(sb)->s_es->s_feature_incompat &= ~cpu_to_le32(mask)
|
||||
|
||||
#define EXT3_FEATURE_COMPAT_DIR_PREALLOC 0x0001
|
||||
#define EXT3_FEATURE_COMPAT_IMAGIC_INODES 0x0002
|
||||
#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
|
||||
#define EXT3_FEATURE_COMPAT_EXT_ATTR 0x0008
|
||||
#define EXT3_FEATURE_COMPAT_RESIZE_INODE 0x0010
|
||||
#define EXT3_FEATURE_COMPAT_DIR_INDEX 0x0020
|
||||
|
||||
#define EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
|
||||
#define EXT3_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
|
||||
#define EXT3_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
|
||||
|
||||
#define EXT3_FEATURE_INCOMPAT_COMPRESSION 0x0001
|
||||
#define EXT3_FEATURE_INCOMPAT_FILETYPE 0x0002
|
||||
#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */
|
||||
#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */
|
||||
#define EXT3_FEATURE_INCOMPAT_META_BG 0x0010
|
||||
|
||||
#define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR
|
||||
#define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \
|
||||
EXT3_FEATURE_INCOMPAT_RECOVER| \
|
||||
EXT3_FEATURE_INCOMPAT_META_BG)
|
||||
#define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
|
||||
EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
|
||||
EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
|
||||
|
||||
/*
|
||||
* Default values for user and/or group using reserved blocks
|
||||
*/
|
||||
#define EXT3_DEF_RESUID 0
|
||||
#define EXT3_DEF_RESGID 0
|
||||
|
||||
/*
|
||||
* Default mount options
|
||||
*/
|
||||
#define EXT3_DEFM_DEBUG 0x0001
|
||||
#define EXT3_DEFM_BSDGROUPS 0x0002
|
||||
#define EXT3_DEFM_XATTR_USER 0x0004
|
||||
#define EXT3_DEFM_ACL 0x0008
|
||||
#define EXT3_DEFM_UID16 0x0010
|
||||
#define EXT3_DEFM_JMODE 0x0060
|
||||
#define EXT3_DEFM_JMODE_DATA 0x0020
|
||||
#define EXT3_DEFM_JMODE_ORDERED 0x0040
|
||||
#define EXT3_DEFM_JMODE_WBACK 0x0060
|
||||
|
||||
/*
|
||||
* Structure of a directory entry
|
||||
*/
|
||||
#define EXT3_NAME_LEN 255
|
||||
|
||||
struct ext3_dir_entry {
|
||||
__le32 inode; /* Inode number */
|
||||
__le16 rec_len; /* Directory entry length */
|
||||
__le16 name_len; /* Name length */
|
||||
char name[EXT3_NAME_LEN]; /* File name */
|
||||
};
|
||||
|
||||
/*
|
||||
* The new version of the directory entry. Since EXT3 structures are
|
||||
* stored in intel byte order, and the name_len field could never be
|
||||
* bigger than 255 chars, it's safe to reclaim the extra byte for the
|
||||
* file_type field.
|
||||
*/
|
||||
struct ext3_dir_entry_2 {
|
||||
__le32 inode; /* Inode number */
|
||||
__le16 rec_len; /* Directory entry length */
|
||||
__u8 name_len; /* Name length */
|
||||
__u8 file_type;
|
||||
char name[EXT3_NAME_LEN]; /* File name */
|
||||
};
|
||||
|
||||
/*
|
||||
* Ext3 directory file types. Only the low 3 bits are used. The
|
||||
* other bits are reserved for now.
|
||||
*/
|
||||
#define EXT3_FT_UNKNOWN 0
|
||||
#define EXT3_FT_REG_FILE 1
|
||||
#define EXT3_FT_DIR 2
|
||||
#define EXT3_FT_CHRDEV 3
|
||||
#define EXT3_FT_BLKDEV 4
|
||||
#define EXT3_FT_FIFO 5
|
||||
#define EXT3_FT_SOCK 6
|
||||
#define EXT3_FT_SYMLINK 7
|
||||
|
||||
#define EXT3_FT_MAX 8
|
||||
|
||||
/*
|
||||
* EXT3_DIR_PAD defines the directory entries boundaries
|
||||
*
|
||||
* NOTE: It must be a multiple of 4
|
||||
*/
|
||||
#define EXT3_DIR_PAD 4
|
||||
#define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1)
|
||||
#define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \
|
||||
~EXT3_DIR_ROUND)
|
||||
#define EXT3_MAX_REC_LEN ((1<<16)-1)
|
||||
|
||||
/*
|
||||
* Tests against MAX_REC_LEN etc were put in place for 64k block
|
||||
* sizes; if that is not possible on this arch, we can skip
|
||||
* those tests and speed things up.
|
||||
*/
|
||||
static inline unsigned ext3_rec_len_from_disk(__le16 dlen)
|
||||
{
|
||||
unsigned len = le16_to_cpu(dlen);
|
||||
|
||||
#if (PAGE_CACHE_SIZE >= 65536)
|
||||
if (len == EXT3_MAX_REC_LEN)
|
||||
return 1 << 16;
|
||||
#endif
|
||||
return len;
|
||||
}
|
||||
|
||||
static inline __le16 ext3_rec_len_to_disk(unsigned len)
|
||||
{
|
||||
#if (PAGE_CACHE_SIZE >= 65536)
|
||||
if (len == (1 << 16))
|
||||
return cpu_to_le16(EXT3_MAX_REC_LEN);
|
||||
else if (len > (1 << 16))
|
||||
BUG();
|
||||
#endif
|
||||
return cpu_to_le16(len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Hash Tree Directory indexing
|
||||
* (c) Daniel Phillips, 2001
|
||||
*/
|
||||
|
||||
#define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \
|
||||
EXT3_FEATURE_COMPAT_DIR_INDEX) && \
|
||||
(EXT3_I(dir)->i_flags & EXT3_INDEX_FL))
|
||||
#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX)
|
||||
#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1)
|
||||
|
||||
/* Legal values for the dx_root hash_version field: */
|
||||
|
||||
#define DX_HASH_LEGACY 0
|
||||
#define DX_HASH_HALF_MD4 1
|
||||
#define DX_HASH_TEA 2
|
||||
#define DX_HASH_LEGACY_UNSIGNED 3
|
||||
#define DX_HASH_HALF_MD4_UNSIGNED 4
|
||||
#define DX_HASH_TEA_UNSIGNED 5
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/* hash info structure used by the directory hash */
|
||||
struct dx_hash_info
|
||||
{
|
||||
u32 hash;
|
||||
u32 minor_hash;
|
||||
int hash_version;
|
||||
u32 *seed;
|
||||
};
|
||||
|
||||
#define EXT3_HTREE_EOF 0x7fffffff
|
||||
|
||||
/*
|
||||
* Control parameters used by ext3_htree_next_block
|
||||
*/
|
||||
#define HASH_NB_ALWAYS 1
|
||||
|
||||
|
||||
/*
|
||||
* Describe an inode's exact location on disk and in memory
|
||||
*/
|
||||
struct ext3_iloc
|
||||
{
|
||||
struct buffer_head *bh;
|
||||
unsigned long offset;
|
||||
unsigned long block_group;
|
||||
};
|
||||
|
||||
static inline struct ext3_inode *ext3_raw_inode(struct ext3_iloc *iloc)
|
||||
{
|
||||
return (struct ext3_inode *) (iloc->bh->b_data + iloc->offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* This structure is stuffed into the struct file's private_data field
|
||||
* for directories. It is where we put information so that we can do
|
||||
* readdir operations in hash tree order.
|
||||
*/
|
||||
struct dir_private_info {
|
||||
struct rb_root root;
|
||||
struct rb_node *curr_node;
|
||||
struct fname *extra_fname;
|
||||
loff_t last_pos;
|
||||
__u32 curr_hash;
|
||||
__u32 curr_minor_hash;
|
||||
__u32 next_hash;
|
||||
};
|
||||
|
||||
/* calculate the first block number of the group */
|
||||
static inline ext3_fsblk_t
|
||||
ext3_group_first_block_no(struct super_block *sb, unsigned long group_no)
|
||||
{
|
||||
return group_no * (ext3_fsblk_t)EXT3_BLOCKS_PER_GROUP(sb) +
|
||||
le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block);
|
||||
}
|
||||
|
||||
/*
|
||||
* Special error return code only used by dx_probe() and its callers.
|
||||
*/
|
||||
#define ERR_BAD_DX_DIR -75000
|
||||
|
||||
/*
|
||||
* Function prototypes
|
||||
*/
|
||||
|
||||
/*
|
||||
* Ok, these declarations are also in <linux/kernel.h> but none of the
|
||||
* ext3 source programs needs to include it so they are duplicated here.
|
||||
*/
|
||||
# define NORET_TYPE /**/
|
||||
# define ATTRIB_NORET __attribute__((noreturn))
|
||||
# define NORET_AND noreturn,
|
||||
|
||||
/* balloc.c */
|
||||
extern int ext3_bg_has_super(struct super_block *sb, int group);
|
||||
extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group);
|
||||
extern ext3_fsblk_t ext3_new_block (handle_t *handle, struct inode *inode,
|
||||
ext3_fsblk_t goal, int *errp);
|
||||
extern ext3_fsblk_t ext3_new_blocks (handle_t *handle, struct inode *inode,
|
||||
ext3_fsblk_t goal, unsigned long *count, int *errp);
|
||||
extern void ext3_free_blocks (handle_t *handle, struct inode *inode,
|
||||
ext3_fsblk_t block, unsigned long count);
|
||||
extern void ext3_free_blocks_sb (handle_t *handle, struct super_block *sb,
|
||||
ext3_fsblk_t block, unsigned long count,
|
||||
unsigned long *pdquot_freed_blocks);
|
||||
extern ext3_fsblk_t ext3_count_free_blocks (struct super_block *);
|
||||
extern void ext3_check_blocks_bitmap (struct super_block *);
|
||||
extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb,
|
||||
unsigned int block_group,
|
||||
struct buffer_head ** bh);
|
||||
extern int ext3_should_retry_alloc(struct super_block *sb, int *retries);
|
||||
extern void ext3_init_block_alloc_info(struct inode *);
|
||||
extern void ext3_rsv_window_add(struct super_block *sb, struct ext3_reserve_window_node *rsv);
|
||||
extern int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range);
|
||||
|
||||
/* dir.c */
|
||||
extern int ext3_check_dir_entry(const char *, struct inode *,
|
||||
struct ext3_dir_entry_2 *,
|
||||
struct buffer_head *, unsigned long);
|
||||
extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash,
|
||||
__u32 minor_hash,
|
||||
struct ext3_dir_entry_2 *dirent);
|
||||
extern void ext3_htree_free_dir_info(struct dir_private_info *p);
|
||||
|
||||
/* fsync.c */
|
||||
extern int ext3_sync_file(struct file *, loff_t, loff_t, int);
|
||||
|
||||
/* hash.c */
|
||||
extern int ext3fs_dirhash(const char *name, int len, struct
|
||||
dx_hash_info *hinfo);
|
||||
|
||||
/* ialloc.c */
|
||||
extern struct inode * ext3_new_inode (handle_t *, struct inode *,
|
||||
const struct qstr *, umode_t);
|
||||
extern void ext3_free_inode (handle_t *, struct inode *);
|
||||
extern struct inode * ext3_orphan_get (struct super_block *, unsigned long);
|
||||
extern unsigned long ext3_count_free_inodes (struct super_block *);
|
||||
extern unsigned long ext3_count_dirs (struct super_block *);
|
||||
extern void ext3_check_inodes_bitmap (struct super_block *);
|
||||
extern unsigned long ext3_count_free (struct buffer_head *, unsigned);
|
||||
|
||||
|
||||
/* inode.c */
|
||||
int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode,
|
||||
struct buffer_head *bh, ext3_fsblk_t blocknr);
|
||||
struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *);
|
||||
struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *);
|
||||
int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
|
||||
sector_t iblock, unsigned long maxblocks, struct buffer_head *bh_result,
|
||||
int create);
|
||||
|
||||
extern struct inode *ext3_iget(struct super_block *, unsigned long);
|
||||
extern int ext3_write_inode (struct inode *, struct writeback_control *);
|
||||
extern int ext3_setattr (struct dentry *, struct iattr *);
|
||||
extern void ext3_evict_inode (struct inode *);
|
||||
extern int ext3_sync_inode (handle_t *, struct inode *);
|
||||
extern void ext3_discard_reservation (struct inode *);
|
||||
extern void ext3_dirty_inode(struct inode *, int);
|
||||
extern int ext3_change_inode_journal_flag(struct inode *, int);
|
||||
extern int ext3_get_inode_loc(struct inode *, struct ext3_iloc *);
|
||||
extern int ext3_can_truncate(struct inode *inode);
|
||||
extern void ext3_truncate(struct inode *inode);
|
||||
extern void ext3_set_inode_flags(struct inode *);
|
||||
extern void ext3_get_inode_flags(struct ext3_inode_info *);
|
||||
extern void ext3_set_aops(struct inode *inode);
|
||||
extern int ext3_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
u64 start, u64 len);
|
||||
|
||||
/* ioctl.c */
|
||||
extern long ext3_ioctl(struct file *, unsigned int, unsigned long);
|
||||
extern long ext3_compat_ioctl(struct file *, unsigned int, unsigned long);
|
||||
|
||||
/* namei.c */
|
||||
extern int ext3_orphan_add(handle_t *, struct inode *);
|
||||
extern int ext3_orphan_del(handle_t *, struct inode *);
|
||||
extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
|
||||
__u32 start_minor_hash, __u32 *next_hash);
|
||||
|
||||
/* resize.c */
|
||||
extern int ext3_group_add(struct super_block *sb,
|
||||
struct ext3_new_group_data *input);
|
||||
extern int ext3_group_extend(struct super_block *sb,
|
||||
struct ext3_super_block *es,
|
||||
ext3_fsblk_t n_blocks_count);
|
||||
|
||||
/* super.c */
|
||||
extern __printf(3, 4)
|
||||
void ext3_error(struct super_block *, const char *, const char *, ...);
|
||||
extern void __ext3_std_error (struct super_block *, const char *, int);
|
||||
extern __printf(3, 4)
|
||||
void ext3_abort(struct super_block *, const char *, const char *, ...);
|
||||
extern __printf(3, 4)
|
||||
void ext3_warning(struct super_block *, const char *, const char *, ...);
|
||||
extern __printf(3, 4)
|
||||
void ext3_msg(struct super_block *, const char *, const char *, ...);
|
||||
extern void ext3_update_dynamic_rev (struct super_block *sb);
|
||||
|
||||
#define ext3_std_error(sb, errno) \
|
||||
do { \
|
||||
if ((errno)) \
|
||||
__ext3_std_error((sb), __func__, (errno)); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Inodes and files operations
|
||||
*/
|
||||
|
||||
/* dir.c */
|
||||
extern const struct file_operations ext3_dir_operations;
|
||||
|
||||
/* file.c */
|
||||
extern const struct inode_operations ext3_file_inode_operations;
|
||||
extern const struct file_operations ext3_file_operations;
|
||||
|
||||
/* namei.c */
|
||||
extern const struct inode_operations ext3_dir_inode_operations;
|
||||
extern const struct inode_operations ext3_special_inode_operations;
|
||||
|
||||
/* symlink.c */
|
||||
extern const struct inode_operations ext3_symlink_inode_operations;
|
||||
extern const struct inode_operations ext3_fast_symlink_inode_operations;
|
||||
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _LINUX_EXT3_FS_H */
|
||||
@@ -1,151 +0,0 @@
|
||||
/*
|
||||
* linux/include/linux/ext3_fs_i.h
|
||||
*
|
||||
* Copyright (C) 1992, 1993, 1994, 1995
|
||||
* Remy Card (card@masi.ibp.fr)
|
||||
* Laboratoire MASI - Institut Blaise Pascal
|
||||
* Universite Pierre et Marie Curie (Paris VI)
|
||||
*
|
||||
* from
|
||||
*
|
||||
* linux/include/linux/minix_fs_i.h
|
||||
*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_EXT3_FS_I
|
||||
#define _LINUX_EXT3_FS_I
|
||||
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/seqlock.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
/* data type for block offset of block group */
|
||||
typedef int ext3_grpblk_t;
|
||||
|
||||
/* data type for filesystem-wide blocks number */
|
||||
typedef unsigned long ext3_fsblk_t;
|
||||
|
||||
#define E3FSBLK "%lu"
|
||||
|
||||
struct ext3_reserve_window {
|
||||
ext3_fsblk_t _rsv_start; /* First byte reserved */
|
||||
ext3_fsblk_t _rsv_end; /* Last byte reserved or 0 */
|
||||
};
|
||||
|
||||
struct ext3_reserve_window_node {
|
||||
struct rb_node rsv_node;
|
||||
__u32 rsv_goal_size;
|
||||
__u32 rsv_alloc_hit;
|
||||
struct ext3_reserve_window rsv_window;
|
||||
};
|
||||
|
||||
struct ext3_block_alloc_info {
|
||||
/* information about reservation window */
|
||||
struct ext3_reserve_window_node rsv_window_node;
|
||||
/*
|
||||
* was i_next_alloc_block in ext3_inode_info
|
||||
* is the logical (file-relative) number of the
|
||||
* most-recently-allocated block in this file.
|
||||
* We use this for detecting linearly ascending allocation requests.
|
||||
*/
|
||||
__u32 last_alloc_logical_block;
|
||||
/*
|
||||
* Was i_next_alloc_goal in ext3_inode_info
|
||||
* is the *physical* companion to i_next_alloc_block.
|
||||
* it the physical block number of the block which was most-recentl
|
||||
* allocated to this file. This give us the goal (target) for the next
|
||||
* allocation when we detect linearly ascending requests.
|
||||
*/
|
||||
ext3_fsblk_t last_alloc_physical_block;
|
||||
};
|
||||
|
||||
#define rsv_start rsv_window._rsv_start
|
||||
#define rsv_end rsv_window._rsv_end
|
||||
|
||||
/*
|
||||
* third extended file system inode data in memory
|
||||
*/
|
||||
struct ext3_inode_info {
|
||||
__le32 i_data[15]; /* unconverted */
|
||||
__u32 i_flags;
|
||||
#ifdef EXT3_FRAGMENTS
|
||||
__u32 i_faddr;
|
||||
__u8 i_frag_no;
|
||||
__u8 i_frag_size;
|
||||
#endif
|
||||
ext3_fsblk_t i_file_acl;
|
||||
__u32 i_dir_acl;
|
||||
__u32 i_dtime;
|
||||
|
||||
/*
|
||||
* i_block_group is the number of the block group which contains
|
||||
* this file's inode. Constant across the lifetime of the inode,
|
||||
* it is ued for making block allocation decisions - we try to
|
||||
* place a file's data blocks near its inode block, and new inodes
|
||||
* near to their parent directory's inode.
|
||||
*/
|
||||
__u32 i_block_group;
|
||||
unsigned long i_state_flags; /* Dynamic state flags for ext3 */
|
||||
|
||||
/* block reservation info */
|
||||
struct ext3_block_alloc_info *i_block_alloc_info;
|
||||
|
||||
__u32 i_dir_start_lookup;
|
||||
#ifdef CONFIG_EXT3_FS_XATTR
|
||||
/*
|
||||
* Extended attributes can be read independently of the main file
|
||||
* data. Taking i_mutex even when reading would cause contention
|
||||
* between readers of EAs and writers of regular file data, so
|
||||
* instead we synchronize on xattr_sem when reading or changing
|
||||
* EAs.
|
||||
*/
|
||||
struct rw_semaphore xattr_sem;
|
||||
#endif
|
||||
|
||||
struct list_head i_orphan; /* unlinked but open inodes */
|
||||
|
||||
/*
|
||||
* i_disksize keeps track of what the inode size is ON DISK, not
|
||||
* in memory. During truncate, i_size is set to the new size by
|
||||
* the VFS prior to calling ext3_truncate(), but the filesystem won't
|
||||
* set i_disksize to 0 until the truncate is actually under way.
|
||||
*
|
||||
* The intent is that i_disksize always represents the blocks which
|
||||
* are used by this file. This allows recovery to restart truncate
|
||||
* on orphans if we crash during truncate. We actually write i_disksize
|
||||
* into the on-disk inode when writing inodes out, instead of i_size.
|
||||
*
|
||||
* The only time when i_disksize and i_size may be different is when
|
||||
* a truncate is in progress. The only things which change i_disksize
|
||||
* are ext3_get_block (growth) and ext3_truncate (shrinkth).
|
||||
*/
|
||||
loff_t i_disksize;
|
||||
|
||||
/* on-disk additional length */
|
||||
__u16 i_extra_isize;
|
||||
|
||||
/*
|
||||
* truncate_mutex is for serialising ext3_truncate() against
|
||||
* ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's
|
||||
* data tree are chopped off during truncate. We can't do that in
|
||||
* ext3 because whenever we perform intermediate commits during
|
||||
* truncate, the inode and all the metadata blocks *must* be in a
|
||||
* consistent state which allows truncation of the orphans to restart
|
||||
* during recovery. Hence we must fix the get_block-vs-truncate race
|
||||
* by other means, so we have truncate_mutex.
|
||||
*/
|
||||
struct mutex truncate_mutex;
|
||||
|
||||
/*
|
||||
* Transactions that contain inode's metadata needed to complete
|
||||
* fsync and fdatasync, respectively.
|
||||
*/
|
||||
atomic_t i_sync_tid;
|
||||
atomic_t i_datasync_tid;
|
||||
|
||||
struct inode vfs_inode;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_EXT3_FS_I */
|
||||
@@ -1,91 +0,0 @@
|
||||
/*
|
||||
* linux/include/linux/ext3_fs_sb.h
|
||||
*
|
||||
* Copyright (C) 1992, 1993, 1994, 1995
|
||||
* Remy Card (card@masi.ibp.fr)
|
||||
* Laboratoire MASI - Institut Blaise Pascal
|
||||
* Universite Pierre et Marie Curie (Paris VI)
|
||||
*
|
||||
* from
|
||||
*
|
||||
* linux/include/linux/minix_fs_sb.h
|
||||
*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_EXT3_FS_SB
|
||||
#define _LINUX_EXT3_FS_SB
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/timer.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/blockgroup_lock.h>
|
||||
#include <linux/percpu_counter.h>
|
||||
#endif
|
||||
#include <linux/rbtree.h>
|
||||
|
||||
/*
|
||||
* third extended-fs super-block data in memory
|
||||
*/
|
||||
struct ext3_sb_info {
|
||||
unsigned long s_frag_size; /* Size of a fragment in bytes */
|
||||
unsigned long s_frags_per_block;/* Number of fragments per block */
|
||||
unsigned long s_inodes_per_block;/* Number of inodes per block */
|
||||
unsigned long s_frags_per_group;/* Number of fragments in a group */
|
||||
unsigned long s_blocks_per_group;/* Number of blocks in a group */
|
||||
unsigned long s_inodes_per_group;/* Number of inodes in a group */
|
||||
unsigned long s_itb_per_group; /* Number of inode table blocks per group */
|
||||
unsigned long s_gdb_count; /* Number of group descriptor blocks */
|
||||
unsigned long s_desc_per_block; /* Number of group descriptors per block */
|
||||
unsigned long s_groups_count; /* Number of groups in the fs */
|
||||
unsigned long s_overhead_last; /* Last calculated overhead */
|
||||
unsigned long s_blocks_last; /* Last seen block count */
|
||||
struct buffer_head * s_sbh; /* Buffer containing the super block */
|
||||
struct ext3_super_block * s_es; /* Pointer to the super block in the buffer */
|
||||
struct buffer_head ** s_group_desc;
|
||||
unsigned long s_mount_opt;
|
||||
ext3_fsblk_t s_sb_block;
|
||||
uid_t s_resuid;
|
||||
gid_t s_resgid;
|
||||
unsigned short s_mount_state;
|
||||
unsigned short s_pad;
|
||||
int s_addr_per_block_bits;
|
||||
int s_desc_per_block_bits;
|
||||
int s_inode_size;
|
||||
int s_first_ino;
|
||||
spinlock_t s_next_gen_lock;
|
||||
u32 s_next_generation;
|
||||
u32 s_hash_seed[4];
|
||||
int s_def_hash_version;
|
||||
int s_hash_unsigned; /* 3 if hash should be signed, 0 if not */
|
||||
struct percpu_counter s_freeblocks_counter;
|
||||
struct percpu_counter s_freeinodes_counter;
|
||||
struct percpu_counter s_dirs_counter;
|
||||
struct blockgroup_lock *s_blockgroup_lock;
|
||||
|
||||
/* root of the per fs reservation window tree */
|
||||
spinlock_t s_rsv_window_lock;
|
||||
struct rb_root s_rsv_window_root;
|
||||
struct ext3_reserve_window_node s_rsv_window_head;
|
||||
|
||||
/* Journaling */
|
||||
struct inode * s_journal_inode;
|
||||
struct journal_s * s_journal;
|
||||
struct list_head s_orphan;
|
||||
struct mutex s_orphan_lock;
|
||||
struct mutex s_resize_lock;
|
||||
unsigned long s_commit_interval;
|
||||
struct block_device *journal_bdev;
|
||||
#ifdef CONFIG_QUOTA
|
||||
char *s_qf_names[MAXQUOTAS]; /* Names of quota files with journalled quota */
|
||||
int s_jquota_fmt; /* Format of quota to use */
|
||||
#endif
|
||||
};
|
||||
|
||||
static inline spinlock_t *
|
||||
sb_bgl_lock(struct ext3_sb_info *sbi, unsigned int block_group)
|
||||
{
|
||||
return bgl_lock_ptr(sbi->s_blockgroup_lock, block_group);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_EXT3_FS_SB */
|
||||
@@ -1,229 +0,0 @@
|
||||
/*
|
||||
* linux/include/linux/ext3_jbd.h
|
||||
*
|
||||
* Written by Stephen C. Tweedie <sct@redhat.com>, 1999
|
||||
*
|
||||
* Copyright 1998--1999 Red Hat corp --- All Rights Reserved
|
||||
*
|
||||
* This file is part of the Linux kernel and is made available under
|
||||
* the terms of the GNU General Public License, version 2, or at your
|
||||
* option, any later version, incorporated herein by reference.
|
||||
*
|
||||
* Ext3-specific journaling extensions.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_EXT3_JBD_H
|
||||
#define _LINUX_EXT3_JBD_H
|
||||
|
||||
#include <linux/fs.h>
|
||||
#include <linux/jbd.h>
|
||||
#include <linux/ext3_fs.h>
|
||||
|
||||
#define EXT3_JOURNAL(inode) (EXT3_SB((inode)->i_sb)->s_journal)
|
||||
|
||||
/* Define the number of blocks we need to account to a transaction to
|
||||
* modify one block of data.
|
||||
*
|
||||
* We may have to touch one inode, one bitmap buffer, up to three
|
||||
* indirection blocks, the group and superblock summaries, and the data
|
||||
* block to complete the transaction. */
|
||||
|
||||
#define EXT3_SINGLEDATA_TRANS_BLOCKS 8U
|
||||
|
||||
/* Extended attribute operations touch at most two data buffers,
|
||||
* two bitmap buffers, and two group summaries, in addition to the inode
|
||||
* and the superblock, which are already accounted for. */
|
||||
|
||||
#define EXT3_XATTR_TRANS_BLOCKS 6U
|
||||
|
||||
/* Define the minimum size for a transaction which modifies data. This
|
||||
* needs to take into account the fact that we may end up modifying two
|
||||
* quota files too (one for the group, one for the user quota). The
|
||||
* superblock only gets updated once, of course, so don't bother
|
||||
* counting that again for the quota updates. */
|
||||
|
||||
#define EXT3_DATA_TRANS_BLOCKS(sb) (EXT3_SINGLEDATA_TRANS_BLOCKS + \
|
||||
EXT3_XATTR_TRANS_BLOCKS - 2 + \
|
||||
EXT3_MAXQUOTAS_TRANS_BLOCKS(sb))
|
||||
|
||||
/* Delete operations potentially hit one directory's namespace plus an
|
||||
* entire inode, plus arbitrary amounts of bitmap/indirection data. Be
|
||||
* generous. We can grow the delete transaction later if necessary. */
|
||||
|
||||
#define EXT3_DELETE_TRANS_BLOCKS(sb) (EXT3_MAXQUOTAS_TRANS_BLOCKS(sb) + 64)
|
||||
|
||||
/* Define an arbitrary limit for the amount of data we will anticipate
|
||||
* writing to any given transaction. For unbounded transactions such as
|
||||
* write(2) and truncate(2) we can write more than this, but we always
|
||||
* start off at the maximum transaction size and grow the transaction
|
||||
* optimistically as we go. */
|
||||
|
||||
#define EXT3_MAX_TRANS_DATA 64U
|
||||
|
||||
/* We break up a large truncate or write transaction once the handle's
|
||||
* buffer credits gets this low, we need either to extend the
|
||||
* transaction or to start a new one. Reserve enough space here for
|
||||
* inode, bitmap, superblock, group and indirection updates for at least
|
||||
* one block, plus two quota updates. Quota allocations are not
|
||||
* needed. */
|
||||
|
||||
#define EXT3_RESERVE_TRANS_BLOCKS 12U
|
||||
|
||||
#define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
/* Amount of blocks needed for quota update - we know that the structure was
|
||||
* allocated so we need to update only inode+data */
|
||||
#define EXT3_QUOTA_TRANS_BLOCKS(sb) (test_opt(sb, QUOTA) ? 2 : 0)
|
||||
/* Amount of blocks needed for quota insert/delete - we do some block writes
|
||||
* but inode, sb and group updates are done only once */
|
||||
#define EXT3_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\
|
||||
(EXT3_SINGLEDATA_TRANS_BLOCKS-3)+3+DQUOT_INIT_REWRITE) : 0)
|
||||
#define EXT3_QUOTA_DEL_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_DEL_ALLOC*\
|
||||
(EXT3_SINGLEDATA_TRANS_BLOCKS-3)+3+DQUOT_DEL_REWRITE) : 0)
|
||||
#else
|
||||
#define EXT3_QUOTA_TRANS_BLOCKS(sb) 0
|
||||
#define EXT3_QUOTA_INIT_BLOCKS(sb) 0
|
||||
#define EXT3_QUOTA_DEL_BLOCKS(sb) 0
|
||||
#endif
|
||||
#define EXT3_MAXQUOTAS_TRANS_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_TRANS_BLOCKS(sb))
|
||||
#define EXT3_MAXQUOTAS_INIT_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_INIT_BLOCKS(sb))
|
||||
#define EXT3_MAXQUOTAS_DEL_BLOCKS(sb) (MAXQUOTAS*EXT3_QUOTA_DEL_BLOCKS(sb))
|
||||
|
||||
int
|
||||
ext3_mark_iloc_dirty(handle_t *handle,
|
||||
struct inode *inode,
|
||||
struct ext3_iloc *iloc);
|
||||
|
||||
/*
|
||||
* On success, We end up with an outstanding reference count against
|
||||
* iloc->bh. This _must_ be cleaned up later.
|
||||
*/
|
||||
|
||||
int ext3_reserve_inode_write(handle_t *handle, struct inode *inode,
|
||||
struct ext3_iloc *iloc);
|
||||
|
||||
int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode);
|
||||
|
||||
/*
|
||||
* Wrapper functions with which ext3 calls into JBD. The intent here is
|
||||
* to allow these to be turned into appropriate stubs so ext3 can control
|
||||
* ext2 filesystems, so ext2+ext3 systems only nee one fs. This work hasn't
|
||||
* been done yet.
|
||||
*/
|
||||
|
||||
static inline void ext3_journal_release_buffer(handle_t *handle,
|
||||
struct buffer_head *bh)
|
||||
{
|
||||
journal_release_buffer(handle, bh);
|
||||
}
|
||||
|
||||
void ext3_journal_abort_handle(const char *caller, const char *err_fn,
|
||||
struct buffer_head *bh, handle_t *handle, int err);
|
||||
|
||||
int __ext3_journal_get_undo_access(const char *where, handle_t *handle,
|
||||
struct buffer_head *bh);
|
||||
|
||||
int __ext3_journal_get_write_access(const char *where, handle_t *handle,
|
||||
struct buffer_head *bh);
|
||||
|
||||
int __ext3_journal_forget(const char *where, handle_t *handle,
|
||||
struct buffer_head *bh);
|
||||
|
||||
int __ext3_journal_revoke(const char *where, handle_t *handle,
|
||||
unsigned long blocknr, struct buffer_head *bh);
|
||||
|
||||
int __ext3_journal_get_create_access(const char *where,
|
||||
handle_t *handle, struct buffer_head *bh);
|
||||
|
||||
int __ext3_journal_dirty_metadata(const char *where,
|
||||
handle_t *handle, struct buffer_head *bh);
|
||||
|
||||
#define ext3_journal_get_undo_access(handle, bh) \
|
||||
__ext3_journal_get_undo_access(__func__, (handle), (bh))
|
||||
#define ext3_journal_get_write_access(handle, bh) \
|
||||
__ext3_journal_get_write_access(__func__, (handle), (bh))
|
||||
#define ext3_journal_revoke(handle, blocknr, bh) \
|
||||
__ext3_journal_revoke(__func__, (handle), (blocknr), (bh))
|
||||
#define ext3_journal_get_create_access(handle, bh) \
|
||||
__ext3_journal_get_create_access(__func__, (handle), (bh))
|
||||
#define ext3_journal_dirty_metadata(handle, bh) \
|
||||
__ext3_journal_dirty_metadata(__func__, (handle), (bh))
|
||||
#define ext3_journal_forget(handle, bh) \
|
||||
__ext3_journal_forget(__func__, (handle), (bh))
|
||||
|
||||
int ext3_journal_dirty_data(handle_t *handle, struct buffer_head *bh);
|
||||
|
||||
handle_t *ext3_journal_start_sb(struct super_block *sb, int nblocks);
|
||||
int __ext3_journal_stop(const char *where, handle_t *handle);
|
||||
|
||||
static inline handle_t *ext3_journal_start(struct inode *inode, int nblocks)
|
||||
{
|
||||
return ext3_journal_start_sb(inode->i_sb, nblocks);
|
||||
}
|
||||
|
||||
#define ext3_journal_stop(handle) \
|
||||
__ext3_journal_stop(__func__, (handle))
|
||||
|
||||
static inline handle_t *ext3_journal_current_handle(void)
|
||||
{
|
||||
return journal_current_handle();
|
||||
}
|
||||
|
||||
static inline int ext3_journal_extend(handle_t *handle, int nblocks)
|
||||
{
|
||||
return journal_extend(handle, nblocks);
|
||||
}
|
||||
|
||||
static inline int ext3_journal_restart(handle_t *handle, int nblocks)
|
||||
{
|
||||
return journal_restart(handle, nblocks);
|
||||
}
|
||||
|
||||
static inline int ext3_journal_blocks_per_page(struct inode *inode)
|
||||
{
|
||||
return journal_blocks_per_page(inode);
|
||||
}
|
||||
|
||||
static inline int ext3_journal_force_commit(journal_t *journal)
|
||||
{
|
||||
return journal_force_commit(journal);
|
||||
}
|
||||
|
||||
/* super.c */
|
||||
int ext3_force_commit(struct super_block *sb);
|
||||
|
||||
static inline int ext3_should_journal_data(struct inode *inode)
|
||||
{
|
||||
if (!S_ISREG(inode->i_mode))
|
||||
return 1;
|
||||
if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA)
|
||||
return 1;
|
||||
if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int ext3_should_order_data(struct inode *inode)
|
||||
{
|
||||
if (!S_ISREG(inode->i_mode))
|
||||
return 0;
|
||||
if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL)
|
||||
return 0;
|
||||
if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int ext3_should_writeback_data(struct inode *inode)
|
||||
{
|
||||
if (!S_ISREG(inode->i_mode))
|
||||
return 0;
|
||||
if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL)
|
||||
return 0;
|
||||
if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _LINUX_EXT3_JBD_H */
|
||||
+34
-12
@@ -21,23 +21,45 @@
|
||||
*/
|
||||
#define NR_OPEN_DEFAULT BITS_PER_LONG
|
||||
|
||||
/*
|
||||
* The embedded_fd_set is a small fd_set,
|
||||
* suitable for most tasks (which open <= BITS_PER_LONG files)
|
||||
*/
|
||||
struct embedded_fd_set {
|
||||
unsigned long fds_bits[1];
|
||||
};
|
||||
|
||||
struct fdtable {
|
||||
unsigned int max_fds;
|
||||
struct file __rcu **fd; /* current fd array */
|
||||
fd_set *close_on_exec;
|
||||
fd_set *open_fds;
|
||||
unsigned long *close_on_exec;
|
||||
unsigned long *open_fds;
|
||||
struct rcu_head rcu;
|
||||
struct fdtable *next;
|
||||
};
|
||||
|
||||
static inline void __set_close_on_exec(int fd, struct fdtable *fdt)
|
||||
{
|
||||
__set_bit(fd, fdt->close_on_exec);
|
||||
}
|
||||
|
||||
static inline void __clear_close_on_exec(int fd, struct fdtable *fdt)
|
||||
{
|
||||
__clear_bit(fd, fdt->close_on_exec);
|
||||
}
|
||||
|
||||
static inline bool close_on_exec(int fd, const struct fdtable *fdt)
|
||||
{
|
||||
return test_bit(fd, fdt->close_on_exec);
|
||||
}
|
||||
|
||||
static inline void __set_open_fd(int fd, struct fdtable *fdt)
|
||||
{
|
||||
__set_bit(fd, fdt->open_fds);
|
||||
}
|
||||
|
||||
static inline void __clear_open_fd(int fd, struct fdtable *fdt)
|
||||
{
|
||||
__clear_bit(fd, fdt->open_fds);
|
||||
}
|
||||
|
||||
static inline bool fd_is_open(int fd, const struct fdtable *fdt)
|
||||
{
|
||||
return test_bit(fd, fdt->open_fds);
|
||||
}
|
||||
|
||||
/*
|
||||
* Open file table structure
|
||||
*/
|
||||
@@ -53,8 +75,8 @@ struct files_struct {
|
||||
*/
|
||||
spinlock_t file_lock ____cacheline_aligned_in_smp;
|
||||
int next_fd;
|
||||
struct embedded_fd_set close_on_exec_init;
|
||||
struct embedded_fd_set open_fds_init;
|
||||
unsigned long close_on_exec_init[1];
|
||||
unsigned long open_fds_init[1];
|
||||
struct file __rcu * fd_array[NR_OPEN_DEFAULT];
|
||||
};
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define _LINUX_FIREWIRE_H
|
||||
|
||||
#include <linux/completion.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
@@ -64,8 +65,6 @@
|
||||
#define CSR_MODEL 0x17
|
||||
#define CSR_DIRECTORY_ID 0x20
|
||||
|
||||
struct device;
|
||||
|
||||
struct fw_csr_iterator {
|
||||
const u32 *p;
|
||||
const u32 *end;
|
||||
|
||||
+10
-13
@@ -92,6 +92,10 @@ struct inodes_stat_t {
|
||||
/* File is opened using open(.., 3, ..) and is writeable only for ioctls
|
||||
(specialy hack for floppy.c) */
|
||||
#define FMODE_WRITE_IOCTL ((__force fmode_t)0x100)
|
||||
/* 32bit hashes as llseek() offset (for directories) */
|
||||
#define FMODE_32BITHASH ((__force fmode_t)0x200)
|
||||
/* 64bit hashes as llseek() offset (for directories) */
|
||||
#define FMODE_64BITHASH ((__force fmode_t)0x400)
|
||||
|
||||
/*
|
||||
* Don't update ctime and mtime.
|
||||
@@ -1211,6 +1215,7 @@ extern int vfs_setlease(struct file *, long, struct file_lock **);
|
||||
extern int lease_modify(struct file_lock **, int);
|
||||
extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
|
||||
extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
|
||||
extern void locks_delete_block(struct file_lock *waiter);
|
||||
extern void lock_flocks(void);
|
||||
extern void unlock_flocks(void);
|
||||
#else /* !CONFIG_FILE_LOCKING */
|
||||
@@ -1355,6 +1360,10 @@ static inline int lock_may_write(struct inode *inode, loff_t start,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline void locks_delete_block(struct file_lock *waiter)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void lock_flocks(void)
|
||||
{
|
||||
}
|
||||
@@ -1872,19 +1881,6 @@ extern struct dentry *mount_pseudo(struct file_system_type *, char *,
|
||||
const struct dentry_operations *dops,
|
||||
unsigned long);
|
||||
|
||||
static inline void sb_mark_dirty(struct super_block *sb)
|
||||
{
|
||||
sb->s_dirt = 1;
|
||||
}
|
||||
static inline void sb_mark_clean(struct super_block *sb)
|
||||
{
|
||||
sb->s_dirt = 0;
|
||||
}
|
||||
static inline int sb_is_dirty(struct super_block *sb)
|
||||
{
|
||||
return sb->s_dirt;
|
||||
}
|
||||
|
||||
/* Alas, no aliases. Too much hassle with bringing module.h everywhere */
|
||||
#define fops_get(fops) \
|
||||
(((fops) && try_module_get((fops)->owner) ? (fops) : NULL))
|
||||
@@ -2515,6 +2511,7 @@ extern int dcache_readdir(struct file *, void *, filldir_t);
|
||||
extern int simple_setattr(struct dentry *, struct iattr *);
|
||||
extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
||||
extern int simple_statfs(struct dentry *, struct kstatfs *);
|
||||
extern int simple_open(struct inode *inode, struct file *file);
|
||||
extern int simple_link(struct dentry *, struct inode *, struct dentry *);
|
||||
extern int simple_unlink(struct inode *, struct dentry *);
|
||||
extern int simple_rmdir(struct inode *, struct dentry *);
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __MACH_MXS_DMA_H__
|
||||
#define __MACH_MXS_DMA_H__
|
||||
|
||||
#include <linux/dmaengine.h>
|
||||
|
||||
struct mxs_dma_data {
|
||||
int chan_irq;
|
||||
};
|
||||
|
||||
static inline int mxs_dma_is_apbh(struct dma_chan *chan)
|
||||
{
|
||||
return !strcmp(dev_name(chan->device->dev), "mxs-dma-apbh");
|
||||
}
|
||||
|
||||
static inline int mxs_dma_is_apbx(struct dma_chan *chan)
|
||||
{
|
||||
return !strcmp(dev_name(chan->device->dev), "mxs-dma-apbx");
|
||||
}
|
||||
|
||||
#endif /* __MACH_MXS_DMA_H__ */
|
||||
@@ -144,12 +144,14 @@ struct event_filter;
|
||||
enum trace_reg {
|
||||
TRACE_REG_REGISTER,
|
||||
TRACE_REG_UNREGISTER,
|
||||
#ifdef CONFIG_PERF_EVENTS
|
||||
TRACE_REG_PERF_REGISTER,
|
||||
TRACE_REG_PERF_UNREGISTER,
|
||||
TRACE_REG_PERF_OPEN,
|
||||
TRACE_REG_PERF_CLOSE,
|
||||
TRACE_REG_PERF_ADD,
|
||||
TRACE_REG_PERF_DEL,
|
||||
#endif
|
||||
};
|
||||
|
||||
struct ftrace_event_call;
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
#define GPIOF_OUT_INIT_LOW (GPIOF_DIR_OUT | GPIOF_INIT_LOW)
|
||||
#define GPIOF_OUT_INIT_HIGH (GPIOF_DIR_OUT | GPIOF_INIT_HIGH)
|
||||
|
||||
/* Gpio pin is open drain */
|
||||
#define GPIOF_OPEN_DRAIN (1 << 2)
|
||||
|
||||
/* Gpio pin is open source */
|
||||
#define GPIOF_OPEN_SOURCE (1 << 3)
|
||||
|
||||
/**
|
||||
* struct gpio - a structure describing a GPIO with configuration
|
||||
* @gpio: the GPIO number
|
||||
|
||||
@@ -6,7 +6,7 @@ struct device;
|
||||
struct gpio_keys_button {
|
||||
/* Configuration parameters */
|
||||
unsigned int code; /* input event code (KEY_*, SW_*) */
|
||||
int gpio;
|
||||
int gpio; /* -1 if this key does not support gpio */
|
||||
int active_low;
|
||||
const char *desc;
|
||||
unsigned int type; /* input event type (EV_KEY, EV_SW, EV_ABS) */
|
||||
@@ -14,6 +14,7 @@ struct gpio_keys_button {
|
||||
int debounce_interval; /* debounce ticks interval in msecs */
|
||||
bool can_disable;
|
||||
int value; /* axis value for EV_ABS */
|
||||
unsigned int irq; /* Irq number in case of interrupt keys */
|
||||
};
|
||||
|
||||
struct gpio_keys_platform_data {
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
header-y += hsi_char.h
|
||||
@@ -0,0 +1,410 @@
|
||||
/*
|
||||
* HSI core header file.
|
||||
*
|
||||
* Copyright (C) 2010 Nokia Corporation. All rights reserved.
|
||||
*
|
||||
* Contact: Carlos Chinea <carlos.chinea@nokia.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_HSI_H__
|
||||
#define __LINUX_HSI_H__
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
/* HSI message ttype */
|
||||
#define HSI_MSG_READ 0
|
||||
#define HSI_MSG_WRITE 1
|
||||
|
||||
/* HSI configuration values */
|
||||
enum {
|
||||
HSI_MODE_STREAM = 1,
|
||||
HSI_MODE_FRAME,
|
||||
};
|
||||
|
||||
enum {
|
||||
HSI_FLOW_SYNC, /* Synchronized flow */
|
||||
HSI_FLOW_PIPE, /* Pipelined flow */
|
||||
};
|
||||
|
||||
enum {
|
||||
HSI_ARB_RR, /* Round-robin arbitration */
|
||||
HSI_ARB_PRIO, /* Channel priority arbitration */
|
||||
};
|
||||
|
||||
#define HSI_MAX_CHANNELS 16
|
||||
|
||||
/* HSI message status codes */
|
||||
enum {
|
||||
HSI_STATUS_COMPLETED, /* Message transfer is completed */
|
||||
HSI_STATUS_PENDING, /* Message pending to be read/write (POLL) */
|
||||
HSI_STATUS_PROCEEDING, /* Message transfer is ongoing */
|
||||
HSI_STATUS_QUEUED, /* Message waiting to be served */
|
||||
HSI_STATUS_ERROR, /* Error when message transfer was ongoing */
|
||||
};
|
||||
|
||||
/* HSI port event codes */
|
||||
enum {
|
||||
HSI_EVENT_START_RX,
|
||||
HSI_EVENT_STOP_RX,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct hsi_config - Configuration for RX/TX HSI modules
|
||||
* @mode: Bit transmission mode (STREAM or FRAME)
|
||||
* @channels: Number of channels to use [1..16]
|
||||
* @speed: Max bit transmission speed (Kbit/s)
|
||||
* @flow: RX flow type (SYNCHRONIZED or PIPELINE)
|
||||
* @arb_mode: Arbitration mode for TX frame (Round robin, priority)
|
||||
*/
|
||||
struct hsi_config {
|
||||
unsigned int mode;
|
||||
unsigned int channels;
|
||||
unsigned int speed;
|
||||
union {
|
||||
unsigned int flow; /* RX only */
|
||||
unsigned int arb_mode; /* TX only */
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* struct hsi_board_info - HSI client board info
|
||||
* @name: Name for the HSI device
|
||||
* @hsi_id: HSI controller id where the client sits
|
||||
* @port: Port number in the controller where the client sits
|
||||
* @tx_cfg: HSI TX configuration
|
||||
* @rx_cfg: HSI RX configuration
|
||||
* @platform_data: Platform related data
|
||||
* @archdata: Architecture-dependent device data
|
||||
*/
|
||||
struct hsi_board_info {
|
||||
const char *name;
|
||||
unsigned int hsi_id;
|
||||
unsigned int port;
|
||||
struct hsi_config tx_cfg;
|
||||
struct hsi_config rx_cfg;
|
||||
void *platform_data;
|
||||
struct dev_archdata *archdata;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_HSI_BOARDINFO
|
||||
extern int hsi_register_board_info(struct hsi_board_info const *info,
|
||||
unsigned int len);
|
||||
#else
|
||||
static inline int hsi_register_board_info(struct hsi_board_info const *info,
|
||||
unsigned int len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_HSI_BOARDINFO */
|
||||
|
||||
/**
|
||||
* struct hsi_client - HSI client attached to an HSI port
|
||||
* @device: Driver model representation of the device
|
||||
* @tx_cfg: HSI TX configuration
|
||||
* @rx_cfg: HSI RX configuration
|
||||
* @hsi_start_rx: Called after incoming wake line goes high
|
||||
* @hsi_stop_rx: Called after incoming wake line goes low
|
||||
*/
|
||||
struct hsi_client {
|
||||
struct device device;
|
||||
struct hsi_config tx_cfg;
|
||||
struct hsi_config rx_cfg;
|
||||
void (*hsi_start_rx)(struct hsi_client *cl);
|
||||
void (*hsi_stop_rx)(struct hsi_client *cl);
|
||||
/* private: */
|
||||
unsigned int pclaimed:1;
|
||||
struct list_head link;
|
||||
};
|
||||
|
||||
#define to_hsi_client(dev) container_of(dev, struct hsi_client, device)
|
||||
|
||||
static inline void hsi_client_set_drvdata(struct hsi_client *cl, void *data)
|
||||
{
|
||||
dev_set_drvdata(&cl->device, data);
|
||||
}
|
||||
|
||||
static inline void *hsi_client_drvdata(struct hsi_client *cl)
|
||||
{
|
||||
return dev_get_drvdata(&cl->device);
|
||||
}
|
||||
|
||||
/**
|
||||
* struct hsi_client_driver - Driver associated to an HSI client
|
||||
* @driver: Driver model representation of the driver
|
||||
*/
|
||||
struct hsi_client_driver {
|
||||
struct device_driver driver;
|
||||
};
|
||||
|
||||
#define to_hsi_client_driver(drv) container_of(drv, struct hsi_client_driver,\
|
||||
driver)
|
||||
|
||||
int hsi_register_client_driver(struct hsi_client_driver *drv);
|
||||
|
||||
static inline void hsi_unregister_client_driver(struct hsi_client_driver *drv)
|
||||
{
|
||||
driver_unregister(&drv->driver);
|
||||
}
|
||||
|
||||
/**
|
||||
* struct hsi_msg - HSI message descriptor
|
||||
* @link: Free to use by the current descriptor owner
|
||||
* @cl: HSI device client that issues the transfer
|
||||
* @sgt: Head of the scatterlist array
|
||||
* @context: Client context data associated to the transfer
|
||||
* @complete: Transfer completion callback
|
||||
* @destructor: Destructor to free resources when flushing
|
||||
* @status: Status of the transfer when completed
|
||||
* @actual_len: Actual length of data transfered on completion
|
||||
* @channel: Channel were to TX/RX the message
|
||||
* @ttype: Transfer type (TX if set, RX otherwise)
|
||||
* @break_frame: if true HSI will send/receive a break frame. Data buffers are
|
||||
* ignored in the request.
|
||||
*/
|
||||
struct hsi_msg {
|
||||
struct list_head link;
|
||||
struct hsi_client *cl;
|
||||
struct sg_table sgt;
|
||||
void *context;
|
||||
|
||||
void (*complete)(struct hsi_msg *msg);
|
||||
void (*destructor)(struct hsi_msg *msg);
|
||||
|
||||
int status;
|
||||
unsigned int actual_len;
|
||||
unsigned int channel;
|
||||
unsigned int ttype:1;
|
||||
unsigned int break_frame:1;
|
||||
};
|
||||
|
||||
struct hsi_msg *hsi_alloc_msg(unsigned int n_frag, gfp_t flags);
|
||||
void hsi_free_msg(struct hsi_msg *msg);
|
||||
|
||||
/**
|
||||
* struct hsi_port - HSI port device
|
||||
* @device: Driver model representation of the device
|
||||
* @tx_cfg: Current TX path configuration
|
||||
* @rx_cfg: Current RX path configuration
|
||||
* @num: Port number
|
||||
* @shared: Set when port can be shared by different clients
|
||||
* @claimed: Reference count of clients which claimed the port
|
||||
* @lock: Serialize port claim
|
||||
* @async: Asynchronous transfer callback
|
||||
* @setup: Callback to set the HSI client configuration
|
||||
* @flush: Callback to clean the HW state and destroy all pending transfers
|
||||
* @start_tx: Callback to inform that a client wants to TX data
|
||||
* @stop_tx: Callback to inform that a client no longer wishes to TX data
|
||||
* @release: Callback to inform that a client no longer uses the port
|
||||
* @clients: List of hsi_clients using the port.
|
||||
* @clock: Lock to serialize access to the clients list.
|
||||
*/
|
||||
struct hsi_port {
|
||||
struct device device;
|
||||
struct hsi_config tx_cfg;
|
||||
struct hsi_config rx_cfg;
|
||||
unsigned int num;
|
||||
unsigned int shared:1;
|
||||
int claimed;
|
||||
struct mutex lock;
|
||||
int (*async)(struct hsi_msg *msg);
|
||||
int (*setup)(struct hsi_client *cl);
|
||||
int (*flush)(struct hsi_client *cl);
|
||||
int (*start_tx)(struct hsi_client *cl);
|
||||
int (*stop_tx)(struct hsi_client *cl);
|
||||
int (*release)(struct hsi_client *cl);
|
||||
struct list_head clients;
|
||||
spinlock_t clock;
|
||||
};
|
||||
|
||||
#define to_hsi_port(dev) container_of(dev, struct hsi_port, device)
|
||||
#define hsi_get_port(cl) to_hsi_port((cl)->device.parent)
|
||||
|
||||
void hsi_event(struct hsi_port *port, unsigned int event);
|
||||
int hsi_claim_port(struct hsi_client *cl, unsigned int share);
|
||||
void hsi_release_port(struct hsi_client *cl);
|
||||
|
||||
static inline int hsi_port_claimed(struct hsi_client *cl)
|
||||
{
|
||||
return cl->pclaimed;
|
||||
}
|
||||
|
||||
static inline void hsi_port_set_drvdata(struct hsi_port *port, void *data)
|
||||
{
|
||||
dev_set_drvdata(&port->device, data);
|
||||
}
|
||||
|
||||
static inline void *hsi_port_drvdata(struct hsi_port *port)
|
||||
{
|
||||
return dev_get_drvdata(&port->device);
|
||||
}
|
||||
|
||||
/**
|
||||
* struct hsi_controller - HSI controller device
|
||||
* @device: Driver model representation of the device
|
||||
* @owner: Pointer to the module owning the controller
|
||||
* @id: HSI controller ID
|
||||
* @num_ports: Number of ports in the HSI controller
|
||||
* @port: Array of HSI ports
|
||||
*/
|
||||
struct hsi_controller {
|
||||
struct device device;
|
||||
struct module *owner;
|
||||
unsigned int id;
|
||||
unsigned int num_ports;
|
||||
struct hsi_port *port;
|
||||
};
|
||||
|
||||
#define to_hsi_controller(dev) container_of(dev, struct hsi_controller, device)
|
||||
|
||||
struct hsi_controller *hsi_alloc_controller(unsigned int n_ports, gfp_t flags);
|
||||
void hsi_free_controller(struct hsi_controller *hsi);
|
||||
int hsi_register_controller(struct hsi_controller *hsi);
|
||||
void hsi_unregister_controller(struct hsi_controller *hsi);
|
||||
|
||||
static inline void hsi_controller_set_drvdata(struct hsi_controller *hsi,
|
||||
void *data)
|
||||
{
|
||||
dev_set_drvdata(&hsi->device, data);
|
||||
}
|
||||
|
||||
static inline void *hsi_controller_drvdata(struct hsi_controller *hsi)
|
||||
{
|
||||
return dev_get_drvdata(&hsi->device);
|
||||
}
|
||||
|
||||
static inline struct hsi_port *hsi_find_port_num(struct hsi_controller *hsi,
|
||||
unsigned int num)
|
||||
{
|
||||
return (num < hsi->num_ports) ? &hsi->port[num] : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* API for HSI clients
|
||||
*/
|
||||
int hsi_async(struct hsi_client *cl, struct hsi_msg *msg);
|
||||
|
||||
/**
|
||||
* hsi_id - Get HSI controller ID associated to a client
|
||||
* @cl: Pointer to a HSI client
|
||||
*
|
||||
* Return the controller id where the client is attached to
|
||||
*/
|
||||
static inline unsigned int hsi_id(struct hsi_client *cl)
|
||||
{
|
||||
return to_hsi_controller(cl->device.parent->parent)->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* hsi_port_id - Gets the port number a client is attached to
|
||||
* @cl: Pointer to HSI client
|
||||
*
|
||||
* Return the port number associated to the client
|
||||
*/
|
||||
static inline unsigned int hsi_port_id(struct hsi_client *cl)
|
||||
{
|
||||
return to_hsi_port(cl->device.parent)->num;
|
||||
}
|
||||
|
||||
/**
|
||||
* hsi_setup - Configure the client's port
|
||||
* @cl: Pointer to the HSI client
|
||||
*
|
||||
* When sharing ports, clients should either relay on a single
|
||||
* client setup or have the same setup for all of them.
|
||||
*
|
||||
* Return -errno on failure, 0 on success
|
||||
*/
|
||||
static inline int hsi_setup(struct hsi_client *cl)
|
||||
{
|
||||
if (!hsi_port_claimed(cl))
|
||||
return -EACCES;
|
||||
return hsi_get_port(cl)->setup(cl);
|
||||
}
|
||||
|
||||
/**
|
||||
* hsi_flush - Flush all pending transactions on the client's port
|
||||
* @cl: Pointer to the HSI client
|
||||
*
|
||||
* This function will destroy all pending hsi_msg in the port and reset
|
||||
* the HW port so it is ready to receive and transmit from a clean state.
|
||||
*
|
||||
* Return -errno on failure, 0 on success
|
||||
*/
|
||||
static inline int hsi_flush(struct hsi_client *cl)
|
||||
{
|
||||
if (!hsi_port_claimed(cl))
|
||||
return -EACCES;
|
||||
return hsi_get_port(cl)->flush(cl);
|
||||
}
|
||||
|
||||
/**
|
||||
* hsi_async_read - Submit a read transfer
|
||||
* @cl: Pointer to the HSI client
|
||||
* @msg: HSI message descriptor of the transfer
|
||||
*
|
||||
* Return -errno on failure, 0 on success
|
||||
*/
|
||||
static inline int hsi_async_read(struct hsi_client *cl, struct hsi_msg *msg)
|
||||
{
|
||||
msg->ttype = HSI_MSG_READ;
|
||||
return hsi_async(cl, msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* hsi_async_write - Submit a write transfer
|
||||
* @cl: Pointer to the HSI client
|
||||
* @msg: HSI message descriptor of the transfer
|
||||
*
|
||||
* Return -errno on failure, 0 on success
|
||||
*/
|
||||
static inline int hsi_async_write(struct hsi_client *cl, struct hsi_msg *msg)
|
||||
{
|
||||
msg->ttype = HSI_MSG_WRITE;
|
||||
return hsi_async(cl, msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* hsi_start_tx - Signal the port that the client wants to start a TX
|
||||
* @cl: Pointer to the HSI client
|
||||
*
|
||||
* Return -errno on failure, 0 on success
|
||||
*/
|
||||
static inline int hsi_start_tx(struct hsi_client *cl)
|
||||
{
|
||||
if (!hsi_port_claimed(cl))
|
||||
return -EACCES;
|
||||
return hsi_get_port(cl)->start_tx(cl);
|
||||
}
|
||||
|
||||
/**
|
||||
* hsi_stop_tx - Signal the port that the client no longer wants to transmit
|
||||
* @cl: Pointer to the HSI client
|
||||
*
|
||||
* Return -errno on failure, 0 on success
|
||||
*/
|
||||
static inline int hsi_stop_tx(struct hsi_client *cl)
|
||||
{
|
||||
if (!hsi_port_claimed(cl))
|
||||
return -EACCES;
|
||||
return hsi_get_port(cl)->stop_tx(cl);
|
||||
}
|
||||
#endif /* __LINUX_HSI_H__ */
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Part of the HSI character device driver.
|
||||
*
|
||||
* Copyright (C) 2010 Nokia Corporation. All rights reserved.
|
||||
*
|
||||
* Contact: Andras Domokos <andras.domokos at nokia.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __HSI_CHAR_H
|
||||
#define __HSI_CHAR_H
|
||||
|
||||
#define HSI_CHAR_MAGIC 'k'
|
||||
#define HSC_IOW(num, dtype) _IOW(HSI_CHAR_MAGIC, num, dtype)
|
||||
#define HSC_IOR(num, dtype) _IOR(HSI_CHAR_MAGIC, num, dtype)
|
||||
#define HSC_IOWR(num, dtype) _IOWR(HSI_CHAR_MAGIC, num, dtype)
|
||||
#define HSC_IO(num) _IO(HSI_CHAR_MAGIC, num)
|
||||
|
||||
#define HSC_RESET HSC_IO(16)
|
||||
#define HSC_SET_PM HSC_IO(17)
|
||||
#define HSC_SEND_BREAK HSC_IO(18)
|
||||
#define HSC_SET_RX HSC_IOW(19, struct hsc_rx_config)
|
||||
#define HSC_GET_RX HSC_IOW(20, struct hsc_rx_config)
|
||||
#define HSC_SET_TX HSC_IOW(21, struct hsc_tx_config)
|
||||
#define HSC_GET_TX HSC_IOW(22, struct hsc_tx_config)
|
||||
|
||||
#define HSC_PM_DISABLE 0
|
||||
#define HSC_PM_ENABLE 1
|
||||
|
||||
#define HSC_MODE_STREAM 1
|
||||
#define HSC_MODE_FRAME 2
|
||||
#define HSC_FLOW_SYNC 0
|
||||
#define HSC_ARB_RR 0
|
||||
#define HSC_ARB_PRIO 1
|
||||
|
||||
struct hsc_rx_config {
|
||||
uint32_t mode;
|
||||
uint32_t flow;
|
||||
uint32_t channels;
|
||||
};
|
||||
|
||||
struct hsc_tx_config {
|
||||
uint32_t mode;
|
||||
uint32_t channels;
|
||||
uint32_t speed;
|
||||
uint32_t arb_mode;
|
||||
};
|
||||
|
||||
#endif /* __HSI_CHAR_H */
|
||||
@@ -15,7 +15,8 @@
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301 USA. */
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301 USA. */
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_I2C_DEV_H
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_I2C_MUX_H
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_I2C_SMBUS_H
|
||||
|
||||
+2
-1
@@ -17,7 +17,8 @@
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301 USA. */
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and
|
||||
|
||||
@@ -761,7 +761,7 @@ struct twl_regulator_driver_data {
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
int twl4030_sih_setup(int module);
|
||||
int twl4030_sih_setup(struct device *dev, int module, int irq_base);
|
||||
|
||||
/* Offsets to Power Registers */
|
||||
#define TWL4030_VDAC_DEV_GRP 0x3B
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include <acpi/acpi.h>
|
||||
#endif
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/* for request_sense */
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
/*
|
||||
* These correspond to the IORESOURCE_IRQ_* defines in
|
||||
|
||||
+11
-1
@@ -971,6 +971,10 @@ extern void __journal_clean_data_list(transaction_t *transaction);
|
||||
/* Log buffer allocation */
|
||||
extern struct journal_head * jbd2_journal_get_descriptor_buffer(journal_t *);
|
||||
int jbd2_journal_next_log_block(journal_t *, unsigned long long *);
|
||||
int jbd2_journal_get_log_tail(journal_t *journal, tid_t *tid,
|
||||
unsigned long *block);
|
||||
void __jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block);
|
||||
void jbd2_update_log_tail(journal_t *journal, tid_t tid, unsigned long block);
|
||||
|
||||
/* Commit management */
|
||||
extern void jbd2_journal_commit_transaction(journal_t *);
|
||||
@@ -1020,6 +1024,11 @@ jbd2_journal_write_metadata_buffer(transaction_t *transaction,
|
||||
/* Transaction locking */
|
||||
extern void __wait_on_journal (journal_t *);
|
||||
|
||||
/* Transaction cache support */
|
||||
extern void jbd2_journal_destroy_transaction_cache(void);
|
||||
extern int jbd2_journal_init_transaction_cache(void);
|
||||
extern void jbd2_journal_free_transaction(transaction_t *);
|
||||
|
||||
/*
|
||||
* Journal locking.
|
||||
*
|
||||
@@ -1082,7 +1091,8 @@ extern int jbd2_journal_destroy (journal_t *);
|
||||
extern int jbd2_journal_recover (journal_t *journal);
|
||||
extern int jbd2_journal_wipe (journal_t *, int);
|
||||
extern int jbd2_journal_skip_recovery (journal_t *);
|
||||
extern void jbd2_journal_update_superblock (journal_t *, int);
|
||||
extern void jbd2_journal_update_sb_log_tail (journal_t *, tid_t,
|
||||
unsigned long, int);
|
||||
extern void __jbd2_journal_abort_hard (journal_t *);
|
||||
extern void jbd2_journal_abort (journal_t *, int);
|
||||
extern int jbd2_journal_errno (journal_t *);
|
||||
|
||||
@@ -66,6 +66,8 @@ struct journal_head {
|
||||
* transaction (if there is one). Only applies to buffers on a
|
||||
* transaction's data or metadata journaling list.
|
||||
* [j_list_lock] [jbd_lock_bh_state()]
|
||||
* Either of these locks is enough for reading, both are needed for
|
||||
* changes.
|
||||
*/
|
||||
transaction_t *b_transaction;
|
||||
|
||||
|
||||
+11
-25
@@ -1,6 +1,8 @@
|
||||
#ifndef _LINUX_KERNEL_H
|
||||
#define _LINUX_KERNEL_H
|
||||
|
||||
#include <linux/sysinfo.h>
|
||||
|
||||
/*
|
||||
* 'kernel.h' contains some often-used function prototypes etc
|
||||
*/
|
||||
@@ -428,16 +430,10 @@ extern int __must_check hex2bin(u8 *dst, const char *src, size_t count);
|
||||
* Most likely, you want to use tracing_on/tracing_off.
|
||||
*/
|
||||
#ifdef CONFIG_RING_BUFFER
|
||||
void tracing_on(void);
|
||||
void tracing_off(void);
|
||||
/* trace_off_permanent stops recording with no way to bring it back */
|
||||
void tracing_off_permanent(void);
|
||||
int tracing_is_on(void);
|
||||
#else
|
||||
static inline void tracing_on(void) { }
|
||||
static inline void tracing_off(void) { }
|
||||
static inline void tracing_off_permanent(void) { }
|
||||
static inline int tracing_is_on(void) { return 0; }
|
||||
#endif
|
||||
|
||||
enum ftrace_dump_mode {
|
||||
@@ -447,6 +443,10 @@ enum ftrace_dump_mode {
|
||||
};
|
||||
|
||||
#ifdef CONFIG_TRACING
|
||||
void tracing_on(void);
|
||||
void tracing_off(void);
|
||||
int tracing_is_on(void);
|
||||
|
||||
extern void tracing_start(void);
|
||||
extern void tracing_stop(void);
|
||||
extern void ftrace_off_permanent(void);
|
||||
@@ -531,6 +531,11 @@ static inline void tracing_start(void) { }
|
||||
static inline void tracing_stop(void) { }
|
||||
static inline void ftrace_off_permanent(void) { }
|
||||
static inline void trace_dump_stack(void) { }
|
||||
|
||||
static inline void tracing_on(void) { }
|
||||
static inline void tracing_off(void) { }
|
||||
static inline int tracing_is_on(void) { return 0; }
|
||||
|
||||
static inline int
|
||||
trace_printk(const char *fmt, ...)
|
||||
{
|
||||
@@ -698,27 +703,8 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
|
||||
# define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD
|
||||
#endif
|
||||
|
||||
struct sysinfo;
|
||||
extern int do_sysinfo(struct sysinfo *info);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#define SI_LOAD_SHIFT 16
|
||||
struct sysinfo {
|
||||
long uptime; /* Seconds since boot */
|
||||
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
|
||||
unsigned long totalram; /* Total usable main memory size */
|
||||
unsigned long freeram; /* Available memory size */
|
||||
unsigned long sharedram; /* Amount of shared memory */
|
||||
unsigned long bufferram; /* Memory used by buffers */
|
||||
unsigned long totalswap; /* Total swap space size */
|
||||
unsigned long freeswap; /* swap space still available */
|
||||
unsigned short procs; /* Number of current processes */
|
||||
unsigned short pad; /* explicit padding for m68k */
|
||||
unsigned long totalhigh; /* Total high memory size */
|
||||
unsigned long freehigh; /* Available high memory size */
|
||||
unsigned int mem_unit; /* Memory unit size in bytes */
|
||||
char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -63,7 +63,8 @@ enum kgdb_bptype {
|
||||
BP_HARDWARE_BREAKPOINT,
|
||||
BP_WRITE_WATCHPOINT,
|
||||
BP_READ_WATCHPOINT,
|
||||
BP_ACCESS_WATCHPOINT
|
||||
BP_ACCESS_WATCHPOINT,
|
||||
BP_POKE_BREAKPOINT,
|
||||
};
|
||||
|
||||
enum kgdb_bpstate {
|
||||
@@ -207,8 +208,8 @@ extern void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc);
|
||||
|
||||
/* Optional functions. */
|
||||
extern int kgdb_validate_break_address(unsigned long addr);
|
||||
extern int kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr);
|
||||
extern int kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle);
|
||||
extern int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt);
|
||||
extern int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt);
|
||||
|
||||
/**
|
||||
* kgdb_arch_late - Perform any architecture specific initalization.
|
||||
|
||||
+22
-5
@@ -110,12 +110,29 @@ call_usermodehelper(char *path, char **argv, char **envp, int wait)
|
||||
|
||||
extern struct ctl_table usermodehelper_table[];
|
||||
|
||||
enum umh_disable_depth {
|
||||
UMH_ENABLED = 0,
|
||||
UMH_FREEZING,
|
||||
UMH_DISABLED,
|
||||
};
|
||||
|
||||
extern void usermodehelper_init(void);
|
||||
|
||||
extern int usermodehelper_disable(void);
|
||||
extern void usermodehelper_enable(void);
|
||||
extern bool usermodehelper_is_disabled(void);
|
||||
extern void read_lock_usermodehelper(void);
|
||||
extern void read_unlock_usermodehelper(void);
|
||||
extern int __usermodehelper_disable(enum umh_disable_depth depth);
|
||||
extern void __usermodehelper_set_disable_depth(enum umh_disable_depth depth);
|
||||
|
||||
static inline int usermodehelper_disable(void)
|
||||
{
|
||||
return __usermodehelper_disable(UMH_DISABLED);
|
||||
}
|
||||
|
||||
static inline void usermodehelper_enable(void)
|
||||
{
|
||||
__usermodehelper_set_disable_depth(UMH_ENABLED);
|
||||
}
|
||||
|
||||
extern int usermodehelper_read_trylock(void);
|
||||
extern long usermodehelper_read_lock_wait(long timeout);
|
||||
extern void usermodehelper_read_unlock(void);
|
||||
|
||||
#endif /* __LINUX_KMOD_H__ */
|
||||
|
||||
@@ -162,6 +162,7 @@ struct kvm_pit_config {
|
||||
#define KVM_EXIT_INTERNAL_ERROR 17
|
||||
#define KVM_EXIT_OSI 18
|
||||
#define KVM_EXIT_PAPR_HCALL 19
|
||||
#define KVM_EXIT_S390_UCONTROL 20
|
||||
|
||||
/* For KVM_EXIT_INTERNAL_ERROR */
|
||||
#define KVM_INTERNAL_ERROR_EMULATION 1
|
||||
@@ -249,6 +250,11 @@ struct kvm_run {
|
||||
#define KVM_S390_RESET_CPU_INIT 8
|
||||
#define KVM_S390_RESET_IPL 16
|
||||
__u64 s390_reset_flags;
|
||||
/* KVM_EXIT_S390_UCONTROL */
|
||||
struct {
|
||||
__u64 trans_exc_code;
|
||||
__u32 pgm_code;
|
||||
} s390_ucontrol;
|
||||
/* KVM_EXIT_DCR */
|
||||
struct {
|
||||
__u32 dcrn;
|
||||
@@ -273,6 +279,20 @@ struct kvm_run {
|
||||
/* Fix the size of the union. */
|
||||
char padding[256];
|
||||
};
|
||||
|
||||
/*
|
||||
* shared registers between kvm and userspace.
|
||||
* kvm_valid_regs specifies the register classes set by the host
|
||||
* kvm_dirty_regs specified the register classes dirtied by userspace
|
||||
* struct kvm_sync_regs is architecture specific, as well as the
|
||||
* bits for kvm_valid_regs and kvm_dirty_regs
|
||||
*/
|
||||
__u64 kvm_valid_regs;
|
||||
__u64 kvm_dirty_regs;
|
||||
union {
|
||||
struct kvm_sync_regs regs;
|
||||
char padding[1024];
|
||||
} s;
|
||||
};
|
||||
|
||||
/* for KVM_REGISTER_COALESCED_MMIO / KVM_UNREGISTER_COALESCED_MMIO */
|
||||
@@ -431,6 +451,11 @@ struct kvm_ppc_pvinfo {
|
||||
|
||||
#define KVMIO 0xAE
|
||||
|
||||
/* machine type bits, to be used as argument to KVM_CREATE_VM */
|
||||
#define KVM_VM_S390_UCONTROL 1
|
||||
|
||||
#define KVM_S390_SIE_PAGE_OFFSET 1
|
||||
|
||||
/*
|
||||
* ioctls for /dev/kvm fds:
|
||||
*/
|
||||
@@ -555,9 +580,15 @@ struct kvm_ppc_pvinfo {
|
||||
#define KVM_CAP_PPC_SMT 64
|
||||
#define KVM_CAP_PPC_RMA 65
|
||||
#define KVM_CAP_MAX_VCPUS 66 /* returns max vcpus per vm */
|
||||
#define KVM_CAP_PPC_HIOR 67
|
||||
#define KVM_CAP_PPC_PAPR 68
|
||||
#define KVM_CAP_SW_TLB 69
|
||||
#define KVM_CAP_ONE_REG 70
|
||||
#define KVM_CAP_S390_GMAP 71
|
||||
#define KVM_CAP_TSC_DEADLINE_TIMER 72
|
||||
#define KVM_CAP_S390_UCONTROL 73
|
||||
#define KVM_CAP_SYNC_REGS 74
|
||||
#define KVM_CAP_PCI_2_3 75
|
||||
|
||||
#ifdef KVM_CAP_IRQ_ROUTING
|
||||
|
||||
@@ -637,6 +668,52 @@ struct kvm_clock_data {
|
||||
__u32 pad[9];
|
||||
};
|
||||
|
||||
#define KVM_MMU_FSL_BOOKE_NOHV 0
|
||||
#define KVM_MMU_FSL_BOOKE_HV 1
|
||||
|
||||
struct kvm_config_tlb {
|
||||
__u64 params;
|
||||
__u64 array;
|
||||
__u32 mmu_type;
|
||||
__u32 array_len;
|
||||
};
|
||||
|
||||
struct kvm_dirty_tlb {
|
||||
__u64 bitmap;
|
||||
__u32 num_dirty;
|
||||
};
|
||||
|
||||
/* Available with KVM_CAP_ONE_REG */
|
||||
|
||||
#define KVM_REG_ARCH_MASK 0xff00000000000000ULL
|
||||
#define KVM_REG_GENERIC 0x0000000000000000ULL
|
||||
|
||||
/*
|
||||
* Architecture specific registers are to be defined in arch headers and
|
||||
* ORed with the arch identifier.
|
||||
*/
|
||||
#define KVM_REG_PPC 0x1000000000000000ULL
|
||||
#define KVM_REG_X86 0x2000000000000000ULL
|
||||
#define KVM_REG_IA64 0x3000000000000000ULL
|
||||
#define KVM_REG_ARM 0x4000000000000000ULL
|
||||
#define KVM_REG_S390 0x5000000000000000ULL
|
||||
|
||||
#define KVM_REG_SIZE_SHIFT 52
|
||||
#define KVM_REG_SIZE_MASK 0x00f0000000000000ULL
|
||||
#define KVM_REG_SIZE_U8 0x0000000000000000ULL
|
||||
#define KVM_REG_SIZE_U16 0x0010000000000000ULL
|
||||
#define KVM_REG_SIZE_U32 0x0020000000000000ULL
|
||||
#define KVM_REG_SIZE_U64 0x0030000000000000ULL
|
||||
#define KVM_REG_SIZE_U128 0x0040000000000000ULL
|
||||
#define KVM_REG_SIZE_U256 0x0050000000000000ULL
|
||||
#define KVM_REG_SIZE_U512 0x0060000000000000ULL
|
||||
#define KVM_REG_SIZE_U1024 0x0070000000000000ULL
|
||||
|
||||
struct kvm_one_reg {
|
||||
__u64 id;
|
||||
__u64 addr;
|
||||
};
|
||||
|
||||
/*
|
||||
* ioctls for VM fds
|
||||
*/
|
||||
@@ -655,6 +732,17 @@ struct kvm_clock_data {
|
||||
struct kvm_userspace_memory_region)
|
||||
#define KVM_SET_TSS_ADDR _IO(KVMIO, 0x47)
|
||||
#define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO, 0x48, __u64)
|
||||
|
||||
/* enable ucontrol for s390 */
|
||||
struct kvm_s390_ucas_mapping {
|
||||
__u64 user_addr;
|
||||
__u64 vcpu_addr;
|
||||
__u64 length;
|
||||
};
|
||||
#define KVM_S390_UCAS_MAP _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
|
||||
#define KVM_S390_UCAS_UNMAP _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
|
||||
#define KVM_S390_VCPU_FAULT _IOW(KVMIO, 0x52, unsigned long)
|
||||
|
||||
/* Device model IOC */
|
||||
#define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60)
|
||||
#define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level)
|
||||
@@ -697,6 +785,9 @@ struct kvm_clock_data {
|
||||
/* Available with KVM_CAP_TSC_CONTROL */
|
||||
#define KVM_SET_TSC_KHZ _IO(KVMIO, 0xa2)
|
||||
#define KVM_GET_TSC_KHZ _IO(KVMIO, 0xa3)
|
||||
/* Available with KVM_CAP_PCI_2_3 */
|
||||
#define KVM_ASSIGN_SET_INTX_MASK _IOW(KVMIO, 0xa4, \
|
||||
struct kvm_assigned_pci_dev)
|
||||
|
||||
/*
|
||||
* ioctls for vcpu fds
|
||||
@@ -763,8 +854,15 @@ struct kvm_clock_data {
|
||||
#define KVM_CREATE_SPAPR_TCE _IOW(KVMIO, 0xa8, struct kvm_create_spapr_tce)
|
||||
/* Available with KVM_CAP_RMA */
|
||||
#define KVM_ALLOCATE_RMA _IOR(KVMIO, 0xa9, struct kvm_allocate_rma)
|
||||
/* Available with KVM_CAP_SW_TLB */
|
||||
#define KVM_DIRTY_TLB _IOW(KVMIO, 0xaa, struct kvm_dirty_tlb)
|
||||
/* Available with KVM_CAP_ONE_REG */
|
||||
#define KVM_GET_ONE_REG _IOW(KVMIO, 0xab, struct kvm_one_reg)
|
||||
#define KVM_SET_ONE_REG _IOW(KVMIO, 0xac, struct kvm_one_reg)
|
||||
|
||||
#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)
|
||||
#define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1)
|
||||
#define KVM_DEV_ASSIGN_MASK_INTX (1 << 2)
|
||||
|
||||
struct kvm_assigned_pci_dev {
|
||||
__u32 assigned_dev_id;
|
||||
|
||||
+57
-12
@@ -172,11 +172,6 @@ static inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
#define KVM_MEM_MAX_NR_PAGES ((1UL << 31) - 1)
|
||||
|
||||
struct kvm_lpage_info {
|
||||
unsigned long rmap_pde;
|
||||
int write_count;
|
||||
};
|
||||
|
||||
struct kvm_memory_slot {
|
||||
gfn_t base_gfn;
|
||||
unsigned long npages;
|
||||
@@ -185,7 +180,7 @@ struct kvm_memory_slot {
|
||||
unsigned long *dirty_bitmap;
|
||||
unsigned long *dirty_bitmap_head;
|
||||
unsigned long nr_dirty_pages;
|
||||
struct kvm_lpage_info *lpage_info[KVM_NR_PAGE_SIZES - 1];
|
||||
struct kvm_arch_memory_slot arch;
|
||||
unsigned long userspace_addr;
|
||||
int user_alloc;
|
||||
int id;
|
||||
@@ -377,6 +372,9 @@ int kvm_set_memory_region(struct kvm *kvm,
|
||||
int __kvm_set_memory_region(struct kvm *kvm,
|
||||
struct kvm_userspace_memory_region *mem,
|
||||
int user_alloc);
|
||||
void kvm_arch_free_memslot(struct kvm_memory_slot *free,
|
||||
struct kvm_memory_slot *dont);
|
||||
int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages);
|
||||
int kvm_arch_prepare_memory_region(struct kvm *kvm,
|
||||
struct kvm_memory_slot *memslot,
|
||||
struct kvm_memory_slot old,
|
||||
@@ -386,6 +384,7 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
|
||||
struct kvm_userspace_memory_region *mem,
|
||||
struct kvm_memory_slot old,
|
||||
int user_alloc);
|
||||
bool kvm_largepages_enabled(void);
|
||||
void kvm_disable_largepages(void);
|
||||
void kvm_arch_flush_shadow(struct kvm *kvm);
|
||||
|
||||
@@ -451,6 +450,7 @@ long kvm_arch_dev_ioctl(struct file *filp,
|
||||
unsigned int ioctl, unsigned long arg);
|
||||
long kvm_arch_vcpu_ioctl(struct file *filp,
|
||||
unsigned int ioctl, unsigned long arg);
|
||||
int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf);
|
||||
|
||||
int kvm_dev_ioctl_check_extension(long ext);
|
||||
|
||||
@@ -521,7 +521,7 @@ static inline void kvm_arch_free_vm(struct kvm *kvm)
|
||||
}
|
||||
#endif
|
||||
|
||||
int kvm_arch_init_vm(struct kvm *kvm);
|
||||
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type);
|
||||
void kvm_arch_destroy_vm(struct kvm *kvm);
|
||||
void kvm_free_all_assigned_devices(struct kvm *kvm);
|
||||
void kvm_arch_sync_events(struct kvm *kvm);
|
||||
@@ -547,6 +547,7 @@ struct kvm_assigned_dev_kernel {
|
||||
unsigned int entries_nr;
|
||||
int host_irq;
|
||||
bool host_irq_disabled;
|
||||
bool pci_2_3;
|
||||
struct msix_entry *host_msix_entries;
|
||||
int guest_irq;
|
||||
struct msix_entry *guest_msix_entries;
|
||||
@@ -556,6 +557,7 @@ struct kvm_assigned_dev_kernel {
|
||||
struct pci_dev *dev;
|
||||
struct kvm *kvm;
|
||||
spinlock_t intx_lock;
|
||||
spinlock_t intx_mask_lock;
|
||||
char irq_name[32];
|
||||
struct pci_saved_state *pci_saved_state;
|
||||
};
|
||||
@@ -651,11 +653,43 @@ static inline void kvm_guest_exit(void)
|
||||
current->flags &= ~PF_VCPU;
|
||||
}
|
||||
|
||||
/*
|
||||
* search_memslots() and __gfn_to_memslot() are here because they are
|
||||
* used in non-modular code in arch/powerpc/kvm/book3s_hv_rm_mmu.c.
|
||||
* gfn_to_memslot() itself isn't here as an inline because that would
|
||||
* bloat other code too much.
|
||||
*/
|
||||
static inline struct kvm_memory_slot *
|
||||
search_memslots(struct kvm_memslots *slots, gfn_t gfn)
|
||||
{
|
||||
struct kvm_memory_slot *memslot;
|
||||
|
||||
kvm_for_each_memslot(memslot, slots)
|
||||
if (gfn >= memslot->base_gfn &&
|
||||
gfn < memslot->base_gfn + memslot->npages)
|
||||
return memslot;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct kvm_memory_slot *
|
||||
__gfn_to_memslot(struct kvm_memslots *slots, gfn_t gfn)
|
||||
{
|
||||
return search_memslots(slots, gfn);
|
||||
}
|
||||
|
||||
static inline int memslot_id(struct kvm *kvm, gfn_t gfn)
|
||||
{
|
||||
return gfn_to_memslot(kvm, gfn)->id;
|
||||
}
|
||||
|
||||
static inline gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level)
|
||||
{
|
||||
/* KVM_HPAGE_GFN_SHIFT(PT_PAGE_TABLE_LEVEL) must be 0. */
|
||||
return (gfn >> KVM_HPAGE_GFN_SHIFT(level)) -
|
||||
(base_gfn >> KVM_HPAGE_GFN_SHIFT(level));
|
||||
}
|
||||
|
||||
static inline unsigned long gfn_to_hva_memslot(struct kvm_memory_slot *slot,
|
||||
gfn_t gfn)
|
||||
{
|
||||
@@ -702,12 +736,16 @@ static inline int mmu_notifier_retry(struct kvm_vcpu *vcpu, unsigned long mmu_se
|
||||
if (unlikely(vcpu->kvm->mmu_notifier_count))
|
||||
return 1;
|
||||
/*
|
||||
* Both reads happen under the mmu_lock and both values are
|
||||
* modified under mmu_lock, so there's no need of smb_rmb()
|
||||
* here in between, otherwise mmu_notifier_count should be
|
||||
* read before mmu_notifier_seq, see
|
||||
* mmu_notifier_invalidate_range_end write side.
|
||||
* Ensure the read of mmu_notifier_count happens before the read
|
||||
* of mmu_notifier_seq. This interacts with the smp_wmb() in
|
||||
* mmu_notifier_invalidate_range_end to make sure that the caller
|
||||
* either sees the old (non-zero) value of mmu_notifier_count or
|
||||
* the new (incremented) value of mmu_notifier_seq.
|
||||
* PowerPC Book3s HV KVM calls this under a per-page lock
|
||||
* rather than under kvm->mmu_lock, for scalability, so
|
||||
* can't rely on kvm->mmu_lock to keep things ordered.
|
||||
*/
|
||||
smp_rmb();
|
||||
if (vcpu->kvm->mmu_notifier_seq != mmu_seq)
|
||||
return 1;
|
||||
return 0;
|
||||
@@ -770,6 +808,13 @@ static inline bool kvm_vcpu_is_bsp(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return vcpu->kvm->bsp_vcpu_id == vcpu->vcpu_id;
|
||||
}
|
||||
|
||||
bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu);
|
||||
|
||||
#else
|
||||
|
||||
static inline bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu) { return true; }
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
|
||||
|
||||
@@ -56,8 +56,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/cmpxchg.h>
|
||||
|
||||
struct llist_head {
|
||||
struct llist_node *first;
|
||||
|
||||
+16
-2
@@ -1,4 +1,7 @@
|
||||
/*
|
||||
* LP8727 Micro/Mini USB IC with integrated charger
|
||||
*
|
||||
* Copyright (C) 2011 Texas Instruments
|
||||
* Copyright (C) 2011 National Semiconductor
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -32,13 +35,24 @@ enum lp8727_ichg {
|
||||
ICHG_1000mA,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct lp8727_chg_param
|
||||
* @eoc_level : end of charge level setting
|
||||
* @ichg : charging current
|
||||
*/
|
||||
struct lp8727_chg_param {
|
||||
/* end of charge level setting */
|
||||
enum lp8727_eoc_level eoc_level;
|
||||
/* charging current */
|
||||
enum lp8727_ichg ichg;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct lp8727_platform_data
|
||||
* @get_batt_present : check battery status - exists or not
|
||||
* @get_batt_level : get battery voltage (mV)
|
||||
* @get_batt_capacity : get battery capacity (%)
|
||||
* @get_batt_temp : get battery temperature
|
||||
* @ac, @usb : charging parameters each charger type
|
||||
*/
|
||||
struct lp8727_platform_data {
|
||||
u8 (*get_batt_present)(void);
|
||||
u16 (*get_batt_level)(void);
|
||||
|
||||
+25
-72
@@ -21,8 +21,24 @@
|
||||
#include <linux/path.h>
|
||||
#include <linux/key.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
struct lsm_network_audit {
|
||||
int netif;
|
||||
struct sock *sk;
|
||||
u16 family;
|
||||
__be16 dport;
|
||||
__be16 sport;
|
||||
union {
|
||||
struct {
|
||||
__be32 daddr;
|
||||
__be32 saddr;
|
||||
} v4;
|
||||
struct {
|
||||
struct in6_addr daddr;
|
||||
struct in6_addr saddr;
|
||||
} v6;
|
||||
} fam;
|
||||
};
|
||||
|
||||
/* Auxiliary data to use in generating the audit record. */
|
||||
struct common_audit_data {
|
||||
@@ -42,23 +58,7 @@ struct common_audit_data {
|
||||
struct path path;
|
||||
struct dentry *dentry;
|
||||
struct inode *inode;
|
||||
struct {
|
||||
int netif;
|
||||
struct sock *sk;
|
||||
u16 family;
|
||||
__be16 dport;
|
||||
__be16 sport;
|
||||
union {
|
||||
struct {
|
||||
__be32 daddr;
|
||||
__be32 saddr;
|
||||
} v4;
|
||||
struct {
|
||||
struct in6_addr daddr;
|
||||
struct in6_addr saddr;
|
||||
} v6;
|
||||
} fam;
|
||||
} net;
|
||||
struct lsm_network_audit *net;
|
||||
int cap;
|
||||
int ipc_id;
|
||||
struct task_struct *tsk;
|
||||
@@ -73,64 +73,15 @@ struct common_audit_data {
|
||||
/* this union contains LSM specific data */
|
||||
union {
|
||||
#ifdef CONFIG_SECURITY_SMACK
|
||||
/* SMACK data */
|
||||
struct smack_audit_data {
|
||||
const char *function;
|
||||
char *subject;
|
||||
char *object;
|
||||
char *request;
|
||||
int result;
|
||||
} smack_audit_data;
|
||||
struct smack_audit_data *smack_audit_data;
|
||||
#endif
|
||||
#ifdef CONFIG_SECURITY_SELINUX
|
||||
/* SELinux data */
|
||||
struct {
|
||||
u32 ssid;
|
||||
u32 tsid;
|
||||
u16 tclass;
|
||||
u32 requested;
|
||||
u32 audited;
|
||||
u32 denied;
|
||||
/*
|
||||
* auditdeny is a bit tricky and unintuitive. See the
|
||||
* comments in avc.c for it's meaning and usage.
|
||||
*/
|
||||
u32 auditdeny;
|
||||
struct av_decision *avd;
|
||||
int result;
|
||||
} selinux_audit_data;
|
||||
struct selinux_audit_data *selinux_audit_data;
|
||||
#endif
|
||||
#ifdef CONFIG_SECURITY_APPARMOR
|
||||
struct {
|
||||
int error;
|
||||
int op;
|
||||
int type;
|
||||
void *profile;
|
||||
const char *name;
|
||||
const char *info;
|
||||
union {
|
||||
void *target;
|
||||
struct {
|
||||
long pos;
|
||||
void *target;
|
||||
} iface;
|
||||
struct {
|
||||
int rlim;
|
||||
unsigned long max;
|
||||
} rlim;
|
||||
struct {
|
||||
const char *target;
|
||||
u32 request;
|
||||
u32 denied;
|
||||
uid_t ouid;
|
||||
} fs;
|
||||
};
|
||||
} apparmor_audit_data;
|
||||
struct apparmor_audit_data *apparmor_audit_data;
|
||||
#endif
|
||||
};
|
||||
/* these callback will be implemented by a specific LSM */
|
||||
void (*lsm_pre_audit)(struct audit_buffer *, void *);
|
||||
void (*lsm_post_audit)(struct audit_buffer *, void *);
|
||||
}; /* per LSM data pointer union */
|
||||
};
|
||||
|
||||
#define v4info fam.v4
|
||||
@@ -147,6 +98,8 @@ int ipv6_skb_to_auditdata(struct sk_buff *skb,
|
||||
{ memset((_d), 0, sizeof(struct common_audit_data)); \
|
||||
(_d)->type = LSM_AUDIT_DATA_##_t; }
|
||||
|
||||
void common_lsm_audit(struct common_audit_data *a);
|
||||
void common_lsm_audit(struct common_audit_data *a,
|
||||
void (*pre_audit)(struct audit_buffer *, void *),
|
||||
void (*post_audit)(struct audit_buffer *, void *));
|
||||
|
||||
#endif
|
||||
|
||||
@@ -263,6 +263,22 @@ enum {
|
||||
#define PM8607_PD_PREBIAS_MASK (0x1F << 0)
|
||||
#define PM8607_PD_PRECHG_MASK (7 << 5)
|
||||
|
||||
#define PM8606_REF_GP_OSC_OFF 0
|
||||
#define PM8606_REF_GP_OSC_ON 1
|
||||
#define PM8606_REF_GP_OSC_UNKNOWN 2
|
||||
|
||||
/* Clients of reference group and 8MHz oscillator in 88PM8606 */
|
||||
enum pm8606_ref_gp_and_osc_clients {
|
||||
REF_GP_NO_CLIENTS = 0,
|
||||
WLED1_DUTY = (1<<0), /*PF 0x02.7:0*/
|
||||
WLED2_DUTY = (1<<1), /*PF 0x04.7:0*/
|
||||
WLED3_DUTY = (1<<2), /*PF 0x06.7:0*/
|
||||
RGB1_ENABLE = (1<<3), /*PF 0x07.1*/
|
||||
RGB2_ENABLE = (1<<4), /*PF 0x07.2*/
|
||||
LDO_VBR_EN = (1<<5), /*PF 0x12.0*/
|
||||
REF_GP_MAX_CLIENT = 0xFFFF
|
||||
};
|
||||
|
||||
/* Interrupt Number in 88PM8607 */
|
||||
enum {
|
||||
PM8607_IRQ_ONKEY,
|
||||
@@ -298,6 +314,7 @@ enum {
|
||||
struct pm860x_chip {
|
||||
struct device *dev;
|
||||
struct mutex irq_lock;
|
||||
struct mutex osc_lock;
|
||||
struct i2c_client *client;
|
||||
struct i2c_client *companion; /* companion chip client */
|
||||
struct regmap *regmap;
|
||||
@@ -305,12 +322,15 @@ struct pm860x_chip {
|
||||
|
||||
int buck3_double; /* DVC ramp slope double */
|
||||
unsigned short companion_addr;
|
||||
unsigned short osc_vote;
|
||||
int id;
|
||||
int irq_mode;
|
||||
int irq_base;
|
||||
int core_irq;
|
||||
unsigned char chip_version;
|
||||
unsigned char osc_status;
|
||||
|
||||
unsigned int wakeup_flag;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -369,6 +389,9 @@ struct pm860x_platform_data {
|
||||
int num_regulators;
|
||||
};
|
||||
|
||||
extern int pm8606_osc_enable(struct pm860x_chip *, unsigned short);
|
||||
extern int pm8606_osc_disable(struct pm860x_chip *, unsigned short);
|
||||
|
||||
extern int pm860x_reg_read(struct i2c_client *, int);
|
||||
extern int pm860x_reg_write(struct i2c_client *, int, unsigned char);
|
||||
extern int pm860x_bulk_read(struct i2c_client *, int, int, unsigned char *);
|
||||
|
||||
+273
-7
@@ -34,13 +34,6 @@ struct device;
|
||||
#define AB5500_1_1 0x21
|
||||
#define AB5500_2_0 0x24
|
||||
|
||||
/* AB8500 CIDs*/
|
||||
#define AB8500_CUT1P0 0x10
|
||||
#define AB8500_CUT1P1 0x11
|
||||
#define AB8500_CUT2P0 0x20
|
||||
#define AB8500_CUT3P0 0x30
|
||||
#define AB8500_CUT3P3 0x33
|
||||
|
||||
/*
|
||||
* AB3100, EVENTA1, A2 and A3 event register flags
|
||||
* these are catenated into a single 32-bit flag in the code
|
||||
@@ -153,6 +146,279 @@ struct abx500_init_settings {
|
||||
u8 setting;
|
||||
};
|
||||
|
||||
/* Battery driver related data */
|
||||
/*
|
||||
* ADC for the battery thermistor.
|
||||
* When using the ABx500_ADC_THERM_BATCTRL the battery ID resistor is combined
|
||||
* with a NTC resistor to both identify the battery and to measure its
|
||||
* temperature. Different phone manufactures uses different techniques to both
|
||||
* identify the battery and to read its temperature.
|
||||
*/
|
||||
enum abx500_adc_therm {
|
||||
ABx500_ADC_THERM_BATCTRL,
|
||||
ABx500_ADC_THERM_BATTEMP,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct abx500_res_to_temp - defines one point in a temp to res curve. To
|
||||
* be used in battery packs that combines the identification resistor with a
|
||||
* NTC resistor.
|
||||
* @temp: battery pack temperature in Celcius
|
||||
* @resist: NTC resistor net total resistance
|
||||
*/
|
||||
struct abx500_res_to_temp {
|
||||
int temp;
|
||||
int resist;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct abx500_v_to_cap - Table for translating voltage to capacity
|
||||
* @voltage: Voltage in mV
|
||||
* @capacity: Capacity in percent
|
||||
*/
|
||||
struct abx500_v_to_cap {
|
||||
int voltage;
|
||||
int capacity;
|
||||
};
|
||||
|
||||
/* Forward declaration */
|
||||
struct abx500_fg;
|
||||
|
||||
/**
|
||||
* struct abx500_fg_parameters - Fuel gauge algorithm parameters, in seconds
|
||||
* if not specified
|
||||
* @recovery_sleep_timer: Time between measurements while recovering
|
||||
* @recovery_total_time: Total recovery time
|
||||
* @init_timer: Measurement interval during startup
|
||||
* @init_discard_time: Time we discard voltage measurement at startup
|
||||
* @init_total_time: Total init time during startup
|
||||
* @high_curr_time: Time current has to be high to go to recovery
|
||||
* @accu_charging: FG accumulation time while charging
|
||||
* @accu_high_curr: FG accumulation time in high current mode
|
||||
* @high_curr_threshold: High current threshold, in mA
|
||||
* @lowbat_threshold: Low battery threshold, in mV
|
||||
* @overbat_threshold: Over battery threshold, in mV
|
||||
* @battok_falling_th_sel0 Threshold in mV for battOk signal sel0
|
||||
* Resolution in 50 mV step.
|
||||
* @battok_raising_th_sel1 Threshold in mV for battOk signal sel1
|
||||
* Resolution in 50 mV step.
|
||||
* @user_cap_limit Capacity reported from user must be within this
|
||||
* limit to be considered as sane, in percentage
|
||||
* points.
|
||||
* @maint_thres This is the threshold where we stop reporting
|
||||
* battery full while in maintenance, in per cent
|
||||
*/
|
||||
struct abx500_fg_parameters {
|
||||
int recovery_sleep_timer;
|
||||
int recovery_total_time;
|
||||
int init_timer;
|
||||
int init_discard_time;
|
||||
int init_total_time;
|
||||
int high_curr_time;
|
||||
int accu_charging;
|
||||
int accu_high_curr;
|
||||
int high_curr_threshold;
|
||||
int lowbat_threshold;
|
||||
int overbat_threshold;
|
||||
int battok_falling_th_sel0;
|
||||
int battok_raising_th_sel1;
|
||||
int user_cap_limit;
|
||||
int maint_thres;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct abx500_charger_maximization - struct used by the board config.
|
||||
* @use_maxi: Enable maximization for this battery type
|
||||
* @maxi_chg_curr: Maximum charger current allowed
|
||||
* @maxi_wait_cycles: cycles to wait before setting charger current
|
||||
* @charger_curr_step delta between two charger current settings (mA)
|
||||
*/
|
||||
struct abx500_maxim_parameters {
|
||||
bool ena_maxi;
|
||||
int chg_curr;
|
||||
int wait_cycles;
|
||||
int charger_curr_step;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct abx500_battery_type - different batteries supported
|
||||
* @name: battery technology
|
||||
* @resis_high: battery upper resistance limit
|
||||
* @resis_low: battery lower resistance limit
|
||||
* @charge_full_design: Maximum battery capacity in mAh
|
||||
* @nominal_voltage: Nominal voltage of the battery in mV
|
||||
* @termination_vol: max voltage upto which battery can be charged
|
||||
* @termination_curr battery charging termination current in mA
|
||||
* @recharge_vol battery voltage limit that will trigger a new
|
||||
* full charging cycle in the case where maintenan-
|
||||
* -ce charging has been disabled
|
||||
* @normal_cur_lvl: charger current in normal state in mA
|
||||
* @normal_vol_lvl: charger voltage in normal state in mV
|
||||
* @maint_a_cur_lvl: charger current in maintenance A state in mA
|
||||
* @maint_a_vol_lvl: charger voltage in maintenance A state in mV
|
||||
* @maint_a_chg_timer_h: charge time in maintenance A state
|
||||
* @maint_b_cur_lvl: charger current in maintenance B state in mA
|
||||
* @maint_b_vol_lvl: charger voltage in maintenance B state in mV
|
||||
* @maint_b_chg_timer_h: charge time in maintenance B state
|
||||
* @low_high_cur_lvl: charger current in temp low/high state in mA
|
||||
* @low_high_vol_lvl: charger voltage in temp low/high state in mV'
|
||||
* @battery_resistance: battery inner resistance in mOhm.
|
||||
* @n_r_t_tbl_elements: number of elements in r_to_t_tbl
|
||||
* @r_to_t_tbl: table containing resistance to temp points
|
||||
* @n_v_cap_tbl_elements: number of elements in v_to_cap_tbl
|
||||
* @v_to_cap_tbl: Voltage to capacity (in %) table
|
||||
* @n_batres_tbl_elements number of elements in the batres_tbl
|
||||
* @batres_tbl battery internal resistance vs temperature table
|
||||
*/
|
||||
struct abx500_battery_type {
|
||||
int name;
|
||||
int resis_high;
|
||||
int resis_low;
|
||||
int charge_full_design;
|
||||
int nominal_voltage;
|
||||
int termination_vol;
|
||||
int termination_curr;
|
||||
int recharge_vol;
|
||||
int normal_cur_lvl;
|
||||
int normal_vol_lvl;
|
||||
int maint_a_cur_lvl;
|
||||
int maint_a_vol_lvl;
|
||||
int maint_a_chg_timer_h;
|
||||
int maint_b_cur_lvl;
|
||||
int maint_b_vol_lvl;
|
||||
int maint_b_chg_timer_h;
|
||||
int low_high_cur_lvl;
|
||||
int low_high_vol_lvl;
|
||||
int battery_resistance;
|
||||
int n_temp_tbl_elements;
|
||||
struct abx500_res_to_temp *r_to_t_tbl;
|
||||
int n_v_cap_tbl_elements;
|
||||
struct abx500_v_to_cap *v_to_cap_tbl;
|
||||
int n_batres_tbl_elements;
|
||||
struct batres_vs_temp *batres_tbl;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct abx500_bm_capacity_levels - abx500 capacity level data
|
||||
* @critical: critical capacity level in percent
|
||||
* @low: low capacity level in percent
|
||||
* @normal: normal capacity level in percent
|
||||
* @high: high capacity level in percent
|
||||
* @full: full capacity level in percent
|
||||
*/
|
||||
struct abx500_bm_capacity_levels {
|
||||
int critical;
|
||||
int low;
|
||||
int normal;
|
||||
int high;
|
||||
int full;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct abx500_bm_charger_parameters - Charger specific parameters
|
||||
* @usb_volt_max: maximum allowed USB charger voltage in mV
|
||||
* @usb_curr_max: maximum allowed USB charger current in mA
|
||||
* @ac_volt_max: maximum allowed AC charger voltage in mV
|
||||
* @ac_curr_max: maximum allowed AC charger current in mA
|
||||
*/
|
||||
struct abx500_bm_charger_parameters {
|
||||
int usb_volt_max;
|
||||
int usb_curr_max;
|
||||
int ac_volt_max;
|
||||
int ac_curr_max;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct abx500_bm_data - abx500 battery management data
|
||||
* @temp_under under this temp, charging is stopped
|
||||
* @temp_low between this temp and temp_under charging is reduced
|
||||
* @temp_high between this temp and temp_over charging is reduced
|
||||
* @temp_over over this temp, charging is stopped
|
||||
* @temp_now present battery temperature
|
||||
* @temp_interval_chg temperature measurement interval in s when charging
|
||||
* @temp_interval_nochg temperature measurement interval in s when not charging
|
||||
* @main_safety_tmr_h safety timer for main charger
|
||||
* @usb_safety_tmr_h safety timer for usb charger
|
||||
* @bkup_bat_v voltage which we charge the backup battery with
|
||||
* @bkup_bat_i current which we charge the backup battery with
|
||||
* @no_maintenance indicates that maintenance charging is disabled
|
||||
* @abx500_adc_therm placement of thermistor, batctrl or battemp adc
|
||||
* @chg_unknown_bat flag to enable charging of unknown batteries
|
||||
* @enable_overshoot flag to enable VBAT overshoot control
|
||||
* @auto_trig flag to enable auto adc trigger
|
||||
* @fg_res resistance of FG resistor in 0.1mOhm
|
||||
* @n_btypes number of elements in array bat_type
|
||||
* @batt_id index of the identified battery in array bat_type
|
||||
* @interval_charging charge alg cycle period time when charging (sec)
|
||||
* @interval_not_charging charge alg cycle period time when not charging (sec)
|
||||
* @temp_hysteresis temperature hysteresis
|
||||
* @gnd_lift_resistance Battery ground to phone ground resistance (mOhm)
|
||||
* @maxi: maximization parameters
|
||||
* @cap_levels capacity in percent for the different capacity levels
|
||||
* @bat_type table of supported battery types
|
||||
* @chg_params charger parameters
|
||||
* @fg_params fuel gauge parameters
|
||||
*/
|
||||
struct abx500_bm_data {
|
||||
int temp_under;
|
||||
int temp_low;
|
||||
int temp_high;
|
||||
int temp_over;
|
||||
int temp_now;
|
||||
int temp_interval_chg;
|
||||
int temp_interval_nochg;
|
||||
int main_safety_tmr_h;
|
||||
int usb_safety_tmr_h;
|
||||
int bkup_bat_v;
|
||||
int bkup_bat_i;
|
||||
bool no_maintenance;
|
||||
bool chg_unknown_bat;
|
||||
bool enable_overshoot;
|
||||
bool auto_trig;
|
||||
enum abx500_adc_therm adc_therm;
|
||||
int fg_res;
|
||||
int n_btypes;
|
||||
int batt_id;
|
||||
int interval_charging;
|
||||
int interval_not_charging;
|
||||
int temp_hysteresis;
|
||||
int gnd_lift_resistance;
|
||||
const struct abx500_maxim_parameters *maxi;
|
||||
const struct abx500_bm_capacity_levels *cap_levels;
|
||||
const struct abx500_battery_type *bat_type;
|
||||
const struct abx500_bm_charger_parameters *chg_params;
|
||||
const struct abx500_fg_parameters *fg_params;
|
||||
};
|
||||
|
||||
struct abx500_chargalg_platform_data {
|
||||
char **supplied_to;
|
||||
size_t num_supplicants;
|
||||
};
|
||||
|
||||
struct abx500_charger_platform_data {
|
||||
char **supplied_to;
|
||||
size_t num_supplicants;
|
||||
bool autopower_cfg;
|
||||
};
|
||||
|
||||
struct abx500_btemp_platform_data {
|
||||
char **supplied_to;
|
||||
size_t num_supplicants;
|
||||
};
|
||||
|
||||
struct abx500_fg_platform_data {
|
||||
char **supplied_to;
|
||||
size_t num_supplicants;
|
||||
};
|
||||
|
||||
struct abx500_bm_plat_data {
|
||||
struct abx500_bm_data *battery;
|
||||
struct abx500_charger_platform_data *charger;
|
||||
struct abx500_btemp_platform_data *btemp;
|
||||
struct abx500_fg_platform_data *fg;
|
||||
struct abx500_chargalg_platform_data *chargalg;
|
||||
};
|
||||
|
||||
int abx500_set_register_interruptible(struct device *dev, u8 bank, u8 reg,
|
||||
u8 value);
|
||||
int abx500_get_register_interruptible(struct device *dev, u8 bank, u8 reg,
|
||||
|
||||
@@ -0,0 +1,474 @@
|
||||
/*
|
||||
* Copyright ST-Ericsson 2012.
|
||||
*
|
||||
* Author: Arun Murthy <arun.murthy@stericsson.com>
|
||||
* Licensed under GPLv2.
|
||||
*/
|
||||
|
||||
#ifndef _AB8500_BM_H
|
||||
#define _AB8500_BM_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mfd/abx500.h>
|
||||
|
||||
/*
|
||||
* System control 2 register offsets.
|
||||
* bank = 0x02
|
||||
*/
|
||||
#define AB8500_MAIN_WDOG_CTRL_REG 0x01
|
||||
#define AB8500_LOW_BAT_REG 0x03
|
||||
#define AB8500_BATT_OK_REG 0x04
|
||||
/*
|
||||
* USB/ULPI register offsets
|
||||
* Bank : 0x5
|
||||
*/
|
||||
#define AB8500_USB_LINE_STAT_REG 0x80
|
||||
|
||||
/*
|
||||
* Charger / status register offfsets
|
||||
* Bank : 0x0B
|
||||
*/
|
||||
#define AB8500_CH_STATUS1_REG 0x00
|
||||
#define AB8500_CH_STATUS2_REG 0x01
|
||||
#define AB8500_CH_USBCH_STAT1_REG 0x02
|
||||
#define AB8500_CH_USBCH_STAT2_REG 0x03
|
||||
#define AB8500_CH_FSM_STAT_REG 0x04
|
||||
#define AB8500_CH_STAT_REG 0x05
|
||||
|
||||
/*
|
||||
* Charger / control register offfsets
|
||||
* Bank : 0x0B
|
||||
*/
|
||||
#define AB8500_CH_VOLT_LVL_REG 0x40
|
||||
#define AB8500_CH_VOLT_LVL_MAX_REG 0x41 /*Only in Cut2.0*/
|
||||
#define AB8500_CH_OPT_CRNTLVL_REG 0x42
|
||||
#define AB8500_CH_OPT_CRNTLVL_MAX_REG 0x43 /*Only in Cut2.0*/
|
||||
#define AB8500_CH_WD_TIMER_REG 0x50
|
||||
#define AB8500_CHARG_WD_CTRL 0x51
|
||||
#define AB8500_BTEMP_HIGH_TH 0x52
|
||||
#define AB8500_LED_INDICATOR_PWM_CTRL 0x53
|
||||
#define AB8500_LED_INDICATOR_PWM_DUTY 0x54
|
||||
#define AB8500_BATT_OVV 0x55
|
||||
#define AB8500_CHARGER_CTRL 0x56
|
||||
#define AB8500_BAT_CTRL_CURRENT_SOURCE 0x60 /*Only in Cut2.0*/
|
||||
|
||||
/*
|
||||
* Charger / main control register offsets
|
||||
* Bank : 0x0B
|
||||
*/
|
||||
#define AB8500_MCH_CTRL1 0x80
|
||||
#define AB8500_MCH_CTRL2 0x81
|
||||
#define AB8500_MCH_IPT_CURLVL_REG 0x82
|
||||
#define AB8500_CH_WD_REG 0x83
|
||||
|
||||
/*
|
||||
* Charger / USB control register offsets
|
||||
* Bank : 0x0B
|
||||
*/
|
||||
#define AB8500_USBCH_CTRL1_REG 0xC0
|
||||
#define AB8500_USBCH_CTRL2_REG 0xC1
|
||||
#define AB8500_USBCH_IPT_CRNTLVL_REG 0xC2
|
||||
|
||||
/*
|
||||
* Gas Gauge register offsets
|
||||
* Bank : 0x0C
|
||||
*/
|
||||
#define AB8500_GASG_CC_CTRL_REG 0x00
|
||||
#define AB8500_GASG_CC_ACCU1_REG 0x01
|
||||
#define AB8500_GASG_CC_ACCU2_REG 0x02
|
||||
#define AB8500_GASG_CC_ACCU3_REG 0x03
|
||||
#define AB8500_GASG_CC_ACCU4_REG 0x04
|
||||
#define AB8500_GASG_CC_SMPL_CNTRL_REG 0x05
|
||||
#define AB8500_GASG_CC_SMPL_CNTRH_REG 0x06
|
||||
#define AB8500_GASG_CC_SMPL_CNVL_REG 0x07
|
||||
#define AB8500_GASG_CC_SMPL_CNVH_REG 0x08
|
||||
#define AB8500_GASG_CC_CNTR_AVGOFF_REG 0x09
|
||||
#define AB8500_GASG_CC_OFFSET_REG 0x0A
|
||||
#define AB8500_GASG_CC_NCOV_ACCU 0x10
|
||||
#define AB8500_GASG_CC_NCOV_ACCU_CTRL 0x11
|
||||
#define AB8500_GASG_CC_NCOV_ACCU_LOW 0x12
|
||||
#define AB8500_GASG_CC_NCOV_ACCU_MED 0x13
|
||||
#define AB8500_GASG_CC_NCOV_ACCU_HIGH 0x14
|
||||
|
||||
/*
|
||||
* Interrupt register offsets
|
||||
* Bank : 0x0E
|
||||
*/
|
||||
#define AB8500_IT_SOURCE2_REG 0x01
|
||||
#define AB8500_IT_SOURCE21_REG 0x14
|
||||
|
||||
/*
|
||||
* RTC register offsets
|
||||
* Bank: 0x0F
|
||||
*/
|
||||
#define AB8500_RTC_BACKUP_CHG_REG 0x0C
|
||||
#define AB8500_RTC_CC_CONF_REG 0x01
|
||||
#define AB8500_RTC_CTRL_REG 0x0B
|
||||
|
||||
/*
|
||||
* OTP register offsets
|
||||
* Bank : 0x15
|
||||
*/
|
||||
#define AB8500_OTP_CONF_15 0x0E
|
||||
|
||||
/* GPADC constants from AB8500 spec, UM0836 */
|
||||
#define ADC_RESOLUTION 1024
|
||||
#define ADC_CH_MAIN_MIN 0
|
||||
#define ADC_CH_MAIN_MAX 20030
|
||||
#define ADC_CH_VBUS_MIN 0
|
||||
#define ADC_CH_VBUS_MAX 20030
|
||||
#define ADC_CH_VBAT_MIN 2300
|
||||
#define ADC_CH_VBAT_MAX 4800
|
||||
#define ADC_CH_BKBAT_MIN 0
|
||||
#define ADC_CH_BKBAT_MAX 3200
|
||||
|
||||
/* Main charge i/p current */
|
||||
#define MAIN_CH_IP_CUR_0P9A 0x80
|
||||
#define MAIN_CH_IP_CUR_1P0A 0x90
|
||||
#define MAIN_CH_IP_CUR_1P1A 0xA0
|
||||
#define MAIN_CH_IP_CUR_1P2A 0xB0
|
||||
#define MAIN_CH_IP_CUR_1P3A 0xC0
|
||||
#define MAIN_CH_IP_CUR_1P4A 0xD0
|
||||
#define MAIN_CH_IP_CUR_1P5A 0xE0
|
||||
|
||||
/* ChVoltLevel */
|
||||
#define CH_VOL_LVL_3P5 0x00
|
||||
#define CH_VOL_LVL_4P0 0x14
|
||||
#define CH_VOL_LVL_4P05 0x16
|
||||
#define CH_VOL_LVL_4P1 0x1B
|
||||
#define CH_VOL_LVL_4P15 0x20
|
||||
#define CH_VOL_LVL_4P2 0x25
|
||||
#define CH_VOL_LVL_4P6 0x4D
|
||||
|
||||
/* ChOutputCurrentLevel */
|
||||
#define CH_OP_CUR_LVL_0P1 0x00
|
||||
#define CH_OP_CUR_LVL_0P2 0x01
|
||||
#define CH_OP_CUR_LVL_0P3 0x02
|
||||
#define CH_OP_CUR_LVL_0P4 0x03
|
||||
#define CH_OP_CUR_LVL_0P5 0x04
|
||||
#define CH_OP_CUR_LVL_0P6 0x05
|
||||
#define CH_OP_CUR_LVL_0P7 0x06
|
||||
#define CH_OP_CUR_LVL_0P8 0x07
|
||||
#define CH_OP_CUR_LVL_0P9 0x08
|
||||
#define CH_OP_CUR_LVL_1P4 0x0D
|
||||
#define CH_OP_CUR_LVL_1P5 0x0E
|
||||
#define CH_OP_CUR_LVL_1P6 0x0F
|
||||
|
||||
/* BTEMP High thermal limits */
|
||||
#define BTEMP_HIGH_TH_57_0 0x00
|
||||
#define BTEMP_HIGH_TH_52 0x01
|
||||
#define BTEMP_HIGH_TH_57_1 0x02
|
||||
#define BTEMP_HIGH_TH_62 0x03
|
||||
|
||||
/* current is mA */
|
||||
#define USB_0P1A 100
|
||||
#define USB_0P2A 200
|
||||
#define USB_0P3A 300
|
||||
#define USB_0P4A 400
|
||||
#define USB_0P5A 500
|
||||
|
||||
#define LOW_BAT_3P1V 0x20
|
||||
#define LOW_BAT_2P3V 0x00
|
||||
#define LOW_BAT_RESET 0x01
|
||||
#define LOW_BAT_ENABLE 0x01
|
||||
|
||||
/* Backup battery constants */
|
||||
#define BUP_ICH_SEL_50UA 0x00
|
||||
#define BUP_ICH_SEL_150UA 0x04
|
||||
#define BUP_ICH_SEL_300UA 0x08
|
||||
#define BUP_ICH_SEL_700UA 0x0C
|
||||
|
||||
#define BUP_VCH_SEL_2P5V 0x00
|
||||
#define BUP_VCH_SEL_2P6V 0x01
|
||||
#define BUP_VCH_SEL_2P8V 0x02
|
||||
#define BUP_VCH_SEL_3P1V 0x03
|
||||
|
||||
/* Battery OVV constants */
|
||||
#define BATT_OVV_ENA 0x02
|
||||
#define BATT_OVV_TH_3P7 0x00
|
||||
#define BATT_OVV_TH_4P75 0x01
|
||||
|
||||
/* A value to indicate over voltage */
|
||||
#define BATT_OVV_VALUE 4750
|
||||
|
||||
/* VBUS OVV constants */
|
||||
#define VBUS_OVV_SELECT_MASK 0x78
|
||||
#define VBUS_OVV_SELECT_5P6V 0x00
|
||||
#define VBUS_OVV_SELECT_5P7V 0x08
|
||||
#define VBUS_OVV_SELECT_5P8V 0x10
|
||||
#define VBUS_OVV_SELECT_5P9V 0x18
|
||||
#define VBUS_OVV_SELECT_6P0V 0x20
|
||||
#define VBUS_OVV_SELECT_6P1V 0x28
|
||||
#define VBUS_OVV_SELECT_6P2V 0x30
|
||||
#define VBUS_OVV_SELECT_6P3V 0x38
|
||||
|
||||
#define VBUS_AUTO_IN_CURR_LIM_ENA 0x04
|
||||
|
||||
/* Fuel Gauge constants */
|
||||
#define RESET_ACCU 0x02
|
||||
#define READ_REQ 0x01
|
||||
#define CC_DEEP_SLEEP_ENA 0x02
|
||||
#define CC_PWR_UP_ENA 0x01
|
||||
#define CC_SAMPLES_40 0x28
|
||||
#define RD_NCONV_ACCU_REQ 0x01
|
||||
#define CC_CALIB 0x08
|
||||
#define CC_INTAVGOFFSET_ENA 0x10
|
||||
#define CC_MUXOFFSET 0x80
|
||||
#define CC_INT_CAL_N_AVG_MASK 0x60
|
||||
#define CC_INT_CAL_SAMPLES_16 0x40
|
||||
#define CC_INT_CAL_SAMPLES_8 0x20
|
||||
#define CC_INT_CAL_SAMPLES_4 0x00
|
||||
|
||||
/* RTC constants */
|
||||
#define RTC_BUP_CH_ENA 0x10
|
||||
|
||||
/* BatCtrl Current Source Constants */
|
||||
#define BAT_CTRL_7U_ENA 0x01
|
||||
#define BAT_CTRL_20U_ENA 0x02
|
||||
#define BAT_CTRL_CMP_ENA 0x04
|
||||
#define FORCE_BAT_CTRL_CMP_HIGH 0x08
|
||||
#define BAT_CTRL_PULL_UP_ENA 0x10
|
||||
|
||||
/* Battery type */
|
||||
#define BATTERY_UNKNOWN 00
|
||||
|
||||
/**
|
||||
* struct res_to_temp - defines one point in a temp to res curve. To
|
||||
* be used in battery packs that combines the identification resistor with a
|
||||
* NTC resistor.
|
||||
* @temp: battery pack temperature in Celcius
|
||||
* @resist: NTC resistor net total resistance
|
||||
*/
|
||||
struct res_to_temp {
|
||||
int temp;
|
||||
int resist;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct batres_vs_temp - defines one point in a temp vs battery internal
|
||||
* resistance curve.
|
||||
* @temp: battery pack temperature in Celcius
|
||||
* @resist: battery internal reistance in mOhm
|
||||
*/
|
||||
struct batres_vs_temp {
|
||||
int temp;
|
||||
int resist;
|
||||
};
|
||||
|
||||
/* Forward declaration */
|
||||
struct ab8500_fg;
|
||||
|
||||
/**
|
||||
* struct ab8500_fg_parameters - Fuel gauge algorithm parameters, in seconds
|
||||
* if not specified
|
||||
* @recovery_sleep_timer: Time between measurements while recovering
|
||||
* @recovery_total_time: Total recovery time
|
||||
* @init_timer: Measurement interval during startup
|
||||
* @init_discard_time: Time we discard voltage measurement at startup
|
||||
* @init_total_time: Total init time during startup
|
||||
* @high_curr_time: Time current has to be high to go to recovery
|
||||
* @accu_charging: FG accumulation time while charging
|
||||
* @accu_high_curr: FG accumulation time in high current mode
|
||||
* @high_curr_threshold: High current threshold, in mA
|
||||
* @lowbat_threshold: Low battery threshold, in mV
|
||||
* @battok_falling_th_sel0 Threshold in mV for battOk signal sel0
|
||||
* Resolution in 50 mV step.
|
||||
* @battok_raising_th_sel1 Threshold in mV for battOk signal sel1
|
||||
* Resolution in 50 mV step.
|
||||
* @user_cap_limit Capacity reported from user must be within this
|
||||
* limit to be considered as sane, in percentage
|
||||
* points.
|
||||
* @maint_thres This is the threshold where we stop reporting
|
||||
* battery full while in maintenance, in per cent
|
||||
*/
|
||||
struct ab8500_fg_parameters {
|
||||
int recovery_sleep_timer;
|
||||
int recovery_total_time;
|
||||
int init_timer;
|
||||
int init_discard_time;
|
||||
int init_total_time;
|
||||
int high_curr_time;
|
||||
int accu_charging;
|
||||
int accu_high_curr;
|
||||
int high_curr_threshold;
|
||||
int lowbat_threshold;
|
||||
int battok_falling_th_sel0;
|
||||
int battok_raising_th_sel1;
|
||||
int user_cap_limit;
|
||||
int maint_thres;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ab8500_charger_maximization - struct used by the board config.
|
||||
* @use_maxi: Enable maximization for this battery type
|
||||
* @maxi_chg_curr: Maximum charger current allowed
|
||||
* @maxi_wait_cycles: cycles to wait before setting charger current
|
||||
* @charger_curr_step delta between two charger current settings (mA)
|
||||
*/
|
||||
struct ab8500_maxim_parameters {
|
||||
bool ena_maxi;
|
||||
int chg_curr;
|
||||
int wait_cycles;
|
||||
int charger_curr_step;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ab8500_bm_capacity_levels - ab8500 capacity level data
|
||||
* @critical: critical capacity level in percent
|
||||
* @low: low capacity level in percent
|
||||
* @normal: normal capacity level in percent
|
||||
* @high: high capacity level in percent
|
||||
* @full: full capacity level in percent
|
||||
*/
|
||||
struct ab8500_bm_capacity_levels {
|
||||
int critical;
|
||||
int low;
|
||||
int normal;
|
||||
int high;
|
||||
int full;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ab8500_bm_charger_parameters - Charger specific parameters
|
||||
* @usb_volt_max: maximum allowed USB charger voltage in mV
|
||||
* @usb_curr_max: maximum allowed USB charger current in mA
|
||||
* @ac_volt_max: maximum allowed AC charger voltage in mV
|
||||
* @ac_curr_max: maximum allowed AC charger current in mA
|
||||
*/
|
||||
struct ab8500_bm_charger_parameters {
|
||||
int usb_volt_max;
|
||||
int usb_curr_max;
|
||||
int ac_volt_max;
|
||||
int ac_curr_max;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ab8500_bm_data - ab8500 battery management data
|
||||
* @temp_under under this temp, charging is stopped
|
||||
* @temp_low between this temp and temp_under charging is reduced
|
||||
* @temp_high between this temp and temp_over charging is reduced
|
||||
* @temp_over over this temp, charging is stopped
|
||||
* @temp_interval_chg temperature measurement interval in s when charging
|
||||
* @temp_interval_nochg temperature measurement interval in s when not charging
|
||||
* @main_safety_tmr_h safety timer for main charger
|
||||
* @usb_safety_tmr_h safety timer for usb charger
|
||||
* @bkup_bat_v voltage which we charge the backup battery with
|
||||
* @bkup_bat_i current which we charge the backup battery with
|
||||
* @no_maintenance indicates that maintenance charging is disabled
|
||||
* @adc_therm placement of thermistor, batctrl or battemp adc
|
||||
* @chg_unknown_bat flag to enable charging of unknown batteries
|
||||
* @enable_overshoot flag to enable VBAT overshoot control
|
||||
* @fg_res resistance of FG resistor in 0.1mOhm
|
||||
* @n_btypes number of elements in array bat_type
|
||||
* @batt_id index of the identified battery in array bat_type
|
||||
* @interval_charging charge alg cycle period time when charging (sec)
|
||||
* @interval_not_charging charge alg cycle period time when not charging (sec)
|
||||
* @temp_hysteresis temperature hysteresis
|
||||
* @gnd_lift_resistance Battery ground to phone ground resistance (mOhm)
|
||||
* @maxi: maximization parameters
|
||||
* @cap_levels capacity in percent for the different capacity levels
|
||||
* @bat_type table of supported battery types
|
||||
* @chg_params charger parameters
|
||||
* @fg_params fuel gauge parameters
|
||||
*/
|
||||
struct ab8500_bm_data {
|
||||
int temp_under;
|
||||
int temp_low;
|
||||
int temp_high;
|
||||
int temp_over;
|
||||
int temp_interval_chg;
|
||||
int temp_interval_nochg;
|
||||
int main_safety_tmr_h;
|
||||
int usb_safety_tmr_h;
|
||||
int bkup_bat_v;
|
||||
int bkup_bat_i;
|
||||
bool no_maintenance;
|
||||
bool chg_unknown_bat;
|
||||
bool enable_overshoot;
|
||||
enum abx500_adc_therm adc_therm;
|
||||
int fg_res;
|
||||
int n_btypes;
|
||||
int batt_id;
|
||||
int interval_charging;
|
||||
int interval_not_charging;
|
||||
int temp_hysteresis;
|
||||
int gnd_lift_resistance;
|
||||
const struct ab8500_maxim_parameters *maxi;
|
||||
const struct ab8500_bm_capacity_levels *cap_levels;
|
||||
const struct ab8500_bm_charger_parameters *chg_params;
|
||||
const struct ab8500_fg_parameters *fg_params;
|
||||
};
|
||||
|
||||
struct ab8500_charger_platform_data {
|
||||
char **supplied_to;
|
||||
size_t num_supplicants;
|
||||
bool autopower_cfg;
|
||||
};
|
||||
|
||||
struct ab8500_btemp_platform_data {
|
||||
char **supplied_to;
|
||||
size_t num_supplicants;
|
||||
};
|
||||
|
||||
struct ab8500_fg_platform_data {
|
||||
char **supplied_to;
|
||||
size_t num_supplicants;
|
||||
};
|
||||
|
||||
struct ab8500_chargalg_platform_data {
|
||||
char **supplied_to;
|
||||
size_t num_supplicants;
|
||||
};
|
||||
struct ab8500_btemp;
|
||||
struct ab8500_gpadc;
|
||||
struct ab8500_fg;
|
||||
#ifdef CONFIG_AB8500_BM
|
||||
void ab8500_fg_reinit(void);
|
||||
void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA);
|
||||
struct ab8500_btemp *ab8500_btemp_get(void);
|
||||
int ab8500_btemp_get_batctrl_temp(struct ab8500_btemp *btemp);
|
||||
struct ab8500_fg *ab8500_fg_get(void);
|
||||
int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev);
|
||||
int ab8500_fg_inst_curr_start(struct ab8500_fg *di);
|
||||
int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res);
|
||||
int ab8500_fg_inst_curr_done(struct ab8500_fg *di);
|
||||
|
||||
#else
|
||||
int ab8500_fg_inst_curr_done(struct ab8500_fg *di)
|
||||
{
|
||||
}
|
||||
static void ab8500_fg_reinit(void)
|
||||
{
|
||||
}
|
||||
static void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA)
|
||||
{
|
||||
}
|
||||
static struct ab8500_btemp *ab8500_btemp_get(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static int ab8500_btemp_get_batctrl_temp(struct ab8500_btemp *btemp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
struct ab8500_fg *ab8500_fg_get(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int ab8500_fg_inst_curr_start(struct ab8500_fg *di)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* _AB8500_BM_H */
|
||||
@@ -10,12 +10,14 @@
|
||||
|
||||
/*
|
||||
* Platform data to register a block: only the initial gpio/irq number.
|
||||
* Array sizes are large enough to contain all AB8500 and AB9540 GPIO
|
||||
* registers.
|
||||
*/
|
||||
|
||||
struct ab8500_gpio_platform_data {
|
||||
int gpio_base;
|
||||
u32 irq_base;
|
||||
u8 config_reg[7];
|
||||
u8 config_reg[8];
|
||||
};
|
||||
|
||||
#endif /* _AB8500_GPIO_H */
|
||||
|
||||
@@ -71,6 +71,13 @@ static inline int ab8500_sysctrl_clear(u16 reg, u8 bits)
|
||||
#define AB8500_SWATCTRL 0x230
|
||||
#define AB8500_HIQCLKCTRL 0x232
|
||||
#define AB8500_VSIMSYSCLKCTRL 0x233
|
||||
#define AB9540_SYSCLK12BUFCTRL 0x234
|
||||
#define AB9540_SYSCLK12CONFCTRL 0x235
|
||||
#define AB9540_SYSCLK12BUFCTRL2 0x236
|
||||
#define AB9540_SYSCLK12BUF1VALID 0x237
|
||||
#define AB9540_SYSCLK12BUF2VALID 0x238
|
||||
#define AB9540_SYSCLK12BUF3VALID 0x239
|
||||
#define AB9540_SYSCLK12BUF4VALID 0x23A
|
||||
|
||||
/* Bits */
|
||||
#define AB8500_TURNONSTATUS_PORNVBAT BIT(0)
|
||||
@@ -251,4 +258,40 @@ static inline int ab8500_sysctrl_clear(u16 reg, u8 bits)
|
||||
#define AB8500_VSIMSYSCLKCTRL_VSIMSYSCLKREQ7VALID BIT(6)
|
||||
#define AB8500_VSIMSYSCLKCTRL_VSIMSYSCLKREQ8VALID BIT(7)
|
||||
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUF1ENA BIT(0)
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUF2ENA BIT(1)
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUF3ENA BIT(2)
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUF4ENA BIT(3)
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUFENA_MASK 0x0F
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUF1STRE BIT(4)
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUF2STRE BIT(5)
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUF3STRE BIT(6)
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUF4STRE BIT(7)
|
||||
#define AB9540_SYSCLK12BUFCTRL_SYSCLK12BUFSTRE_MASK 0xF0
|
||||
|
||||
#define AB9540_SYSCLK12CONFCTRL_PLL26TO38ENA BIT(0)
|
||||
#define AB9540_SYSCLK12CONFCTRL_SYSCLK12USBMUXSEL BIT(1)
|
||||
#define AB9540_SYSCLK12CONFCTRL_INT384MHZMUXSEL_MASK 0x0C
|
||||
#define AB9540_SYSCLK12CONFCTRL_INT384MHZMUXSEL_SHIFT 2
|
||||
#define AB9540_SYSCLK12CONFCTRL_SYSCLK12BUFMUX BIT(4)
|
||||
#define AB9540_SYSCLK12CONFCTRL_SYSCLK12PLLMUX BIT(5)
|
||||
#define AB9540_SYSCLK12CONFCTRL_SYSCLK2MUXVALID BIT(6)
|
||||
|
||||
#define AB9540_SYSCLK12BUFCTRL2_SYSCLK12BUF1PDENA BIT(0)
|
||||
#define AB9540_SYSCLK12BUFCTRL2_SYSCLK12BUF2PDENA BIT(1)
|
||||
#define AB9540_SYSCLK12BUFCTRL2_SYSCLK12BUF3PDENA BIT(2)
|
||||
#define AB9540_SYSCLK12BUFCTRL2_SYSCLK12BUF4PDENA BIT(3)
|
||||
|
||||
#define AB9540_SYSCLK12BUF1VALID_SYSCLK12BUF1VALID_MASK 0xFF
|
||||
#define AB9540_SYSCLK12BUF1VALID_SYSCLK12BUF1VALID_SHIFT 0
|
||||
|
||||
#define AB9540_SYSCLK12BUF2VALID_SYSCLK12BUF2VALID_MASK 0xFF
|
||||
#define AB9540_SYSCLK12BUF2VALID_SYSCLK12BUF2VALID_SHIFT 0
|
||||
|
||||
#define AB9540_SYSCLK12BUF3VALID_SYSCLK12BUF3VALID_MASK 0xFF
|
||||
#define AB9540_SYSCLK12BUF3VALID_SYSCLK12BUF3VALID_SHIFT 0
|
||||
|
||||
#define AB9540_SYSCLK12BUF4VALID_SYSCLK12BUF4VALID_MASK 0xFF
|
||||
#define AB9540_SYSCLK12BUF4VALID_SYSCLK12BUF4VALID_SHIFT 0
|
||||
|
||||
#endif /* __AB8500_SYSCTRL_H */
|
||||
|
||||
@@ -11,6 +11,29 @@
|
||||
|
||||
struct device;
|
||||
|
||||
/*
|
||||
* AB IC versions
|
||||
*
|
||||
* AB8500_VERSION_AB8500 should be 0xFF but will never be read as need a
|
||||
* non-supported multi-byte I2C access via PRCMU. Set to 0x00 to ease the
|
||||
* print of version string.
|
||||
*/
|
||||
enum ab8500_version {
|
||||
AB8500_VERSION_AB8500 = 0x0,
|
||||
AB8500_VERSION_AB8505 = 0x1,
|
||||
AB8500_VERSION_AB9540 = 0x2,
|
||||
AB8500_VERSION_AB8540 = 0x3,
|
||||
AB8500_VERSION_UNDEFINED,
|
||||
};
|
||||
|
||||
/* AB8500 CIDs*/
|
||||
#define AB8500_CUTEARLY 0x00
|
||||
#define AB8500_CUT1P0 0x10
|
||||
#define AB8500_CUT1P1 0x11
|
||||
#define AB8500_CUT2P0 0x20
|
||||
#define AB8500_CUT3P0 0x30
|
||||
#define AB8500_CUT3P3 0x33
|
||||
|
||||
/*
|
||||
* AB8500 bank addresses
|
||||
*/
|
||||
@@ -37,30 +60,34 @@ struct device;
|
||||
|
||||
/*
|
||||
* Interrupts
|
||||
* Values used to index into array ab8500_irq_regoffset[] defined in
|
||||
* drivers/mdf/ab8500-core.c
|
||||
*/
|
||||
|
||||
#define AB8500_INT_MAIN_EXT_CH_NOT_OK 0
|
||||
#define AB8500_INT_UN_PLUG_TV_DET 1
|
||||
#define AB8500_INT_PLUG_TV_DET 2
|
||||
/* Definitions for AB8500 and AB9540 */
|
||||
/* ab8500_irq_regoffset[0] -> IT[Source|Latch|Mask]1 */
|
||||
#define AB8500_INT_MAIN_EXT_CH_NOT_OK 0 /* not 8505/9540 */
|
||||
#define AB8500_INT_UN_PLUG_TV_DET 1 /* not 8505/9540 */
|
||||
#define AB8500_INT_PLUG_TV_DET 2 /* not 8505/9540 */
|
||||
#define AB8500_INT_TEMP_WARM 3
|
||||
#define AB8500_INT_PON_KEY2DB_F 4
|
||||
#define AB8500_INT_PON_KEY2DB_R 5
|
||||
#define AB8500_INT_PON_KEY1DB_F 6
|
||||
#define AB8500_INT_PON_KEY1DB_R 7
|
||||
/* ab8500_irq_regoffset[1] -> IT[Source|Latch|Mask]2 */
|
||||
#define AB8500_INT_BATT_OVV 8
|
||||
#define AB8500_INT_MAIN_CH_UNPLUG_DET 10
|
||||
#define AB8500_INT_MAIN_CH_PLUG_DET 11
|
||||
#define AB8500_INT_USB_ID_DET_F 12
|
||||
#define AB8500_INT_USB_ID_DET_R 13
|
||||
#define AB8500_INT_MAIN_CH_UNPLUG_DET 10 /* not 8505 */
|
||||
#define AB8500_INT_MAIN_CH_PLUG_DET 11 /* not 8505 */
|
||||
#define AB8500_INT_VBUS_DET_F 14
|
||||
#define AB8500_INT_VBUS_DET_R 15
|
||||
/* ab8500_irq_regoffset[2] -> IT[Source|Latch|Mask]3 */
|
||||
#define AB8500_INT_VBUS_CH_DROP_END 16
|
||||
#define AB8500_INT_RTC_60S 17
|
||||
#define AB8500_INT_RTC_ALARM 18
|
||||
#define AB8500_INT_BAT_CTRL_INDB 20
|
||||
#define AB8500_INT_CH_WD_EXP 21
|
||||
#define AB8500_INT_VBUS_OVV 22
|
||||
#define AB8500_INT_MAIN_CH_DROP_END 23
|
||||
#define AB8500_INT_MAIN_CH_DROP_END 23 /* not 8505/9540 */
|
||||
/* ab8500_irq_regoffset[3] -> IT[Source|Latch|Mask]4 */
|
||||
#define AB8500_INT_CCN_CONV_ACC 24
|
||||
#define AB8500_INT_INT_AUD 25
|
||||
#define AB8500_INT_CCEOC 26
|
||||
@@ -69,7 +96,8 @@ struct device;
|
||||
#define AB8500_INT_LOW_BAT_R 29
|
||||
#define AB8500_INT_BUP_CHG_NOT_OK 30
|
||||
#define AB8500_INT_BUP_CHG_OK 31
|
||||
#define AB8500_INT_GP_HW_ADC_CONV_END 32
|
||||
/* ab8500_irq_regoffset[4] -> IT[Source|Latch|Mask]5 */
|
||||
#define AB8500_INT_GP_HW_ADC_CONV_END 32 /* not 8505 */
|
||||
#define AB8500_INT_ACC_DETECT_1DB_F 33
|
||||
#define AB8500_INT_ACC_DETECT_1DB_R 34
|
||||
#define AB8500_INT_ACC_DETECT_22DB_F 35
|
||||
@@ -77,38 +105,43 @@ struct device;
|
||||
#define AB8500_INT_ACC_DETECT_21DB_F 37
|
||||
#define AB8500_INT_ACC_DETECT_21DB_R 38
|
||||
#define AB8500_INT_GP_SW_ADC_CONV_END 39
|
||||
#define AB8500_INT_GPIO6R 40
|
||||
#define AB8500_INT_GPIO7R 41
|
||||
#define AB8500_INT_GPIO8R 42
|
||||
#define AB8500_INT_GPIO9R 43
|
||||
/* ab8500_irq_regoffset[5] -> IT[Source|Latch|Mask]7 */
|
||||
#define AB8500_INT_GPIO6R 40 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO7R 41 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO8R 42 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO9R 43 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO10R 44
|
||||
#define AB8500_INT_GPIO11R 45
|
||||
#define AB8500_INT_GPIO12R 46
|
||||
#define AB8500_INT_GPIO12R 46 /* not 8505 */
|
||||
#define AB8500_INT_GPIO13R 47
|
||||
#define AB8500_INT_GPIO24R 48
|
||||
#define AB8500_INT_GPIO25R 49
|
||||
#define AB8500_INT_GPIO36R 50
|
||||
#define AB8500_INT_GPIO37R 51
|
||||
#define AB8500_INT_GPIO38R 52
|
||||
#define AB8500_INT_GPIO39R 53
|
||||
/* ab8500_irq_regoffset[6] -> IT[Source|Latch|Mask]8 */
|
||||
#define AB8500_INT_GPIO24R 48 /* not 8505 */
|
||||
#define AB8500_INT_GPIO25R 49 /* not 8505 */
|
||||
#define AB8500_INT_GPIO36R 50 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO37R 51 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO38R 52 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO39R 53 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO40R 54
|
||||
#define AB8500_INT_GPIO41R 55
|
||||
#define AB8500_INT_GPIO6F 56
|
||||
#define AB8500_INT_GPIO7F 57
|
||||
#define AB8500_INT_GPIO8F 58
|
||||
#define AB8500_INT_GPIO9F 59
|
||||
/* ab8500_irq_regoffset[7] -> IT[Source|Latch|Mask]9 */
|
||||
#define AB8500_INT_GPIO6F 56 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO7F 57 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO8F 58 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO9F 59 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO10F 60
|
||||
#define AB8500_INT_GPIO11F 61
|
||||
#define AB8500_INT_GPIO12F 62
|
||||
#define AB8500_INT_GPIO12F 62 /* not 8505 */
|
||||
#define AB8500_INT_GPIO13F 63
|
||||
#define AB8500_INT_GPIO24F 64
|
||||
#define AB8500_INT_GPIO25F 65
|
||||
#define AB8500_INT_GPIO36F 66
|
||||
#define AB8500_INT_GPIO37F 67
|
||||
#define AB8500_INT_GPIO38F 68
|
||||
#define AB8500_INT_GPIO39F 69
|
||||
/* ab8500_irq_regoffset[8] -> IT[Source|Latch|Mask]10 */
|
||||
#define AB8500_INT_GPIO24F 64 /* not 8505 */
|
||||
#define AB8500_INT_GPIO25F 65 /* not 8505 */
|
||||
#define AB8500_INT_GPIO36F 66 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO37F 67 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO38F 68 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO39F 69 /* not 8505/9540 */
|
||||
#define AB8500_INT_GPIO40F 70
|
||||
#define AB8500_INT_GPIO41F 71
|
||||
/* ab8500_irq_regoffset[9] -> IT[Source|Latch|Mask]12 */
|
||||
#define AB8500_INT_ADP_SOURCE_ERROR 72
|
||||
#define AB8500_INT_ADP_SINK_ERROR 73
|
||||
#define AB8500_INT_ADP_PROBE_PLUG 74
|
||||
@@ -116,30 +149,67 @@ struct device;
|
||||
#define AB8500_INT_ADP_SENSE_OFF 76
|
||||
#define AB8500_INT_USB_PHY_POWER_ERR 78
|
||||
#define AB8500_INT_USB_LINK_STATUS 79
|
||||
/* ab8500_irq_regoffset[10] -> IT[Source|Latch|Mask]19 */
|
||||
#define AB8500_INT_BTEMP_LOW 80
|
||||
#define AB8500_INT_BTEMP_LOW_MEDIUM 81
|
||||
#define AB8500_INT_BTEMP_MEDIUM_HIGH 82
|
||||
#define AB8500_INT_BTEMP_HIGH 83
|
||||
#define AB8500_INT_USB_CHARGER_NOT_OK 89
|
||||
/* ab8500_irq_regoffset[11] -> IT[Source|Latch|Mask]20 */
|
||||
#define AB8500_INT_SRP_DETECT 88
|
||||
#define AB8500_INT_USB_CHARGER_NOT_OKR 89
|
||||
#define AB8500_INT_ID_WAKEUP_R 90
|
||||
#define AB8500_INT_ID_DET_R1R 92
|
||||
#define AB8500_INT_ID_DET_R2R 93
|
||||
#define AB8500_INT_ID_DET_R3R 94
|
||||
#define AB8500_INT_ID_DET_R4R 95
|
||||
/* ab8500_irq_regoffset[12] -> IT[Source|Latch|Mask]21 */
|
||||
#define AB8500_INT_ID_WAKEUP_F 96
|
||||
#define AB8500_INT_ID_DET_R1F 98
|
||||
#define AB8500_INT_ID_DET_R2F 99
|
||||
#define AB8500_INT_ID_DET_R3F 100
|
||||
#define AB8500_INT_ID_DET_R4F 101
|
||||
#define AB8500_INT_USB_CHG_DET_DONE 102
|
||||
#define AB8500_INT_CHAUTORESTARTAFTSEC 102
|
||||
#define AB8500_INT_CHSTOPBYSEC 103
|
||||
/* ab8500_irq_regoffset[13] -> IT[Source|Latch|Mask]22 */
|
||||
#define AB8500_INT_USB_CH_TH_PROT_F 104
|
||||
#define AB8500_INT_USB_CH_TH_PROT_R 105
|
||||
#define AB8500_INT_MAIN_CH_TH_PROT_F 106
|
||||
#define AB8500_INT_MAIN_CH_TH_PROT_R 107
|
||||
#define AB8500_INT_USB_CHARGER_NOT_OKF 111
|
||||
#define AB8500_INT_MAIN_CH_TH_PROT_F 106 /* not 8505/9540 */
|
||||
#define AB8500_INT_MAIN_CH_TH_PROT_R 107 /* not 8505/9540 */
|
||||
#define AB8500_INT_CHCURLIMNOHSCHIRP 109
|
||||
#define AB8500_INT_CHCURLIMHSCHIRP 110
|
||||
#define AB8500_INT_XTAL32K_KO 111
|
||||
|
||||
/* Definitions for AB9540 */
|
||||
/* ab8500_irq_regoffset[14] -> IT[Source|Latch|Mask]13 */
|
||||
#define AB9540_INT_GPIO50R 113
|
||||
#define AB9540_INT_GPIO51R 114 /* not 8505 */
|
||||
#define AB9540_INT_GPIO52R 115
|
||||
#define AB9540_INT_GPIO53R 116
|
||||
#define AB9540_INT_GPIO54R 117 /* not 8505 */
|
||||
#define AB9540_INT_IEXT_CH_RF_BFN_R 118
|
||||
#define AB9540_INT_IEXT_CH_RF_BFN_F 119
|
||||
/* ab8500_irq_regoffset[15] -> IT[Source|Latch|Mask]14 */
|
||||
#define AB9540_INT_GPIO50F 121
|
||||
#define AB9540_INT_GPIO51F 122 /* not 8505 */
|
||||
#define AB9540_INT_GPIO52F 123
|
||||
#define AB9540_INT_GPIO53F 124
|
||||
#define AB9540_INT_GPIO54F 125 /* not 8505 */
|
||||
|
||||
/*
|
||||
* AB8500_AB9540_NR_IRQS is used when configuring the IRQ numbers for the
|
||||
* entire platform. This is a "compile time" constant so this must be set to
|
||||
* the largest possible value that may be encountered with different AB SOCs.
|
||||
* Of the currently supported AB devices, AB8500 and AB9540, it is the AB9540
|
||||
* which is larger.
|
||||
*/
|
||||
#define AB8500_NR_IRQS 112
|
||||
#define AB8505_NR_IRQS 128
|
||||
#define AB9540_NR_IRQS 128
|
||||
/* This is set to the roof of any AB8500 chip variant IRQ counts */
|
||||
#define AB8500_MAX_NR_IRQS AB9540_NR_IRQS
|
||||
|
||||
#define AB8500_NUM_IRQ_REGS 14
|
||||
#define AB9540_NUM_IRQ_REGS 17
|
||||
|
||||
/**
|
||||
* struct ab8500 - ab8500 internal structure
|
||||
@@ -147,13 +217,18 @@ struct device;
|
||||
* @lock: read/write operations lock
|
||||
* @irq_lock: genirq bus lock
|
||||
* @irq: irq line
|
||||
* @version: chip version id (e.g. ab8500 or ab9540)
|
||||
* @chip_id: chip revision id
|
||||
* @write: register write
|
||||
* @write_masked: masked register write
|
||||
* @read: register read
|
||||
* @rx_buf: rx buf for SPI
|
||||
* @tx_buf: tx buf for SPI
|
||||
* @mask: cache of IRQ regs for bus lock
|
||||
* @oldmask: cache of previous IRQ regs for bus lock
|
||||
* @mask_size: Actual number of valid entries in mask[], oldmask[] and
|
||||
* irq_reg_offset
|
||||
* @irq_reg_offset: Array of offsets into IRQ registers
|
||||
*/
|
||||
struct ab8500 {
|
||||
struct device *dev;
|
||||
@@ -162,16 +237,20 @@ struct ab8500 {
|
||||
|
||||
int irq_base;
|
||||
int irq;
|
||||
enum ab8500_version version;
|
||||
u8 chip_id;
|
||||
|
||||
int (*write) (struct ab8500 *a8500, u16 addr, u8 data);
|
||||
int (*read) (struct ab8500 *a8500, u16 addr);
|
||||
int (*write)(struct ab8500 *ab8500, u16 addr, u8 data);
|
||||
int (*write_masked)(struct ab8500 *ab8500, u16 addr, u8 mask, u8 data);
|
||||
int (*read)(struct ab8500 *ab8500, u16 addr);
|
||||
|
||||
unsigned long tx_buf[4];
|
||||
unsigned long rx_buf[4];
|
||||
|
||||
u8 mask[AB8500_NUM_IRQ_REGS];
|
||||
u8 oldmask[AB8500_NUM_IRQ_REGS];
|
||||
u8 *mask;
|
||||
u8 *oldmask;
|
||||
int mask_size;
|
||||
const int *irq_reg_offset;
|
||||
};
|
||||
|
||||
struct regulator_reg_init;
|
||||
@@ -197,7 +276,52 @@ struct ab8500_platform_data {
|
||||
struct ab8500_gpio_platform_data *gpio;
|
||||
};
|
||||
|
||||
extern int __devinit ab8500_init(struct ab8500 *ab8500);
|
||||
extern int __devinit ab8500_init(struct ab8500 *ab8500,
|
||||
enum ab8500_version version);
|
||||
extern int __devexit ab8500_exit(struct ab8500 *ab8500);
|
||||
|
||||
static inline int is_ab8500(struct ab8500 *ab)
|
||||
{
|
||||
return ab->version == AB8500_VERSION_AB8500;
|
||||
}
|
||||
|
||||
static inline int is_ab8505(struct ab8500 *ab)
|
||||
{
|
||||
return ab->version == AB8500_VERSION_AB8505;
|
||||
}
|
||||
|
||||
static inline int is_ab9540(struct ab8500 *ab)
|
||||
{
|
||||
return ab->version == AB8500_VERSION_AB9540;
|
||||
}
|
||||
|
||||
static inline int is_ab8540(struct ab8500 *ab)
|
||||
{
|
||||
return ab->version == AB8500_VERSION_AB8540;
|
||||
}
|
||||
|
||||
/* exclude also ab8505, ab9540... */
|
||||
static inline int is_ab8500_1p0_or_earlier(struct ab8500 *ab)
|
||||
{
|
||||
return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT1P0));
|
||||
}
|
||||
|
||||
/* exclude also ab8505, ab9540... */
|
||||
static inline int is_ab8500_1p1_or_earlier(struct ab8500 *ab)
|
||||
{
|
||||
return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT1P1));
|
||||
}
|
||||
|
||||
/* exclude also ab8505, ab9540... */
|
||||
static inline int is_ab8500_2p0_or_earlier(struct ab8500 *ab)
|
||||
{
|
||||
return (is_ab8500(ab) && (ab->chip_id <= AB8500_CUT2P0));
|
||||
}
|
||||
|
||||
/* exclude also ab8505, ab9540... */
|
||||
static inline int is_ab8500_2p0(struct ab8500 *ab)
|
||||
{
|
||||
return (is_ab8500(ab) && (ab->chip_id == AB8500_CUT2P0));
|
||||
}
|
||||
|
||||
#endif /* MFD_AB8500_H */
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (C) ST-Ericsson SA 2012
|
||||
* Author: Johan Gardsmark <johan.gardsmark@stericsson.com> for ST-Ericsson.
|
||||
* License terms: GNU General Public License (GPL), version 2
|
||||
*/
|
||||
|
||||
#ifndef _UX500_CHARGALG_H
|
||||
#define _UX500_CHARGALG_H
|
||||
|
||||
#include <linux/power_supply.h>
|
||||
|
||||
#define psy_to_ux500_charger(x) container_of((x), \
|
||||
struct ux500_charger, psy)
|
||||
|
||||
/* Forward declaration */
|
||||
struct ux500_charger;
|
||||
|
||||
struct ux500_charger_ops {
|
||||
int (*enable) (struct ux500_charger *, int, int, int);
|
||||
int (*kick_wd) (struct ux500_charger *);
|
||||
int (*update_curr) (struct ux500_charger *, int);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ux500_charger - power supply ux500 charger sub class
|
||||
* @psy power supply base class
|
||||
* @ops ux500 charger operations
|
||||
* @max_out_volt maximum output charger voltage in mV
|
||||
* @max_out_curr maximum output charger current in mA
|
||||
*/
|
||||
struct ux500_charger {
|
||||
struct power_supply psy;
|
||||
struct ux500_charger_ops ops;
|
||||
int max_out_volt;
|
||||
int max_out_curr;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* anatop.h - Anatop MFD driver
|
||||
*
|
||||
* Copyright (C) 2012 Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
|
||||
* Copyright (C) 2012 Linaro
|
||||
*
|
||||
* 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; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_MFD_ANATOP_H
|
||||
#define __LINUX_MFD_ANATOP_H
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
/**
|
||||
* anatop - MFD data
|
||||
* @ioreg: ioremap register
|
||||
* @reglock: spinlock for register read/write
|
||||
*/
|
||||
struct anatop {
|
||||
void *ioreg;
|
||||
spinlock_t reglock;
|
||||
};
|
||||
|
||||
extern u32 anatop_get_bits(struct anatop *, u32, int, int);
|
||||
extern void anatop_set_bits(struct anatop *, u32, int, int, u32);
|
||||
|
||||
#endif /* __LINUX_MFD_ANATOP_H */
|
||||
@@ -76,8 +76,6 @@ enum da9052_chip_id {
|
||||
struct da9052_pdata;
|
||||
|
||||
struct da9052 {
|
||||
struct mutex io_lock;
|
||||
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
|
||||
|
||||
@@ -11,6 +11,24 @@
|
||||
#define __MFD_DB8500_PRCMU_H
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/*
|
||||
* Registers
|
||||
*/
|
||||
#define DB8500_PRCM_GPIOCR 0x138
|
||||
#define DB8500_PRCM_GPIOCR_DBG_UARTMOD_CMD0 BIT(0)
|
||||
#define DB8500_PRCM_GPIOCR_DBG_STM_APE_CMD BIT(9)
|
||||
#define DB8500_PRCM_GPIOCR_DBG_STM_MOD_CMD1 BIT(11)
|
||||
#define DB8500_PRCM_GPIOCR_SPI2_SELECT BIT(23)
|
||||
|
||||
#define DB8500_PRCM_LINE_VALUE 0x170
|
||||
#define DB8500_PRCM_LINE_VALUE_HSI_CAWAKE0 BIT(3)
|
||||
|
||||
#define DB8500_PRCM_DSI_SW_RESET 0x324
|
||||
#define DB8500_PRCM_DSI_SW_RESET_DSI0_SW_RESETN BIT(0)
|
||||
#define DB8500_PRCM_DSI_SW_RESET_DSI1_SW_RESETN BIT(1)
|
||||
#define DB8500_PRCM_DSI_SW_RESET_DSI2_SW_RESETN BIT(2)
|
||||
|
||||
/* This portion previously known as <mach/prcmu-fw-defs_v1.h> */
|
||||
|
||||
@@ -421,40 +439,22 @@ enum auto_enable {
|
||||
/* End of file previously known as prcmu-fw-defs_v1.h */
|
||||
|
||||
/**
|
||||
* enum hw_acc_dev - enum for hw accelerators
|
||||
* @HW_ACC_SVAMMDSP: for SVAMMDSP
|
||||
* @HW_ACC_SVAPIPE: for SVAPIPE
|
||||
* @HW_ACC_SIAMMDSP: for SIAMMDSP
|
||||
* @HW_ACC_SIAPIPE: for SIAPIPE
|
||||
* @HW_ACC_SGA: for SGA
|
||||
* @HW_ACC_B2R2: for B2R2
|
||||
* @HW_ACC_MCDE: for MCDE
|
||||
* @HW_ACC_ESRAM1: for ESRAM1
|
||||
* @HW_ACC_ESRAM2: for ESRAM2
|
||||
* @HW_ACC_ESRAM3: for ESRAM3
|
||||
* @HW_ACC_ESRAM4: for ESRAM4
|
||||
* @NUM_HW_ACC: number of hardware accelerators
|
||||
* enum prcmu_power_status - results from set_power_state
|
||||
* @PRCMU_SLEEP_OK: Sleep went ok
|
||||
* @PRCMU_DEEP_SLEEP_OK: DeepSleep went ok
|
||||
* @PRCMU_IDLE_OK: Idle went ok
|
||||
* @PRCMU_DEEPIDLE_OK: DeepIdle went ok
|
||||
* @PRCMU_PRCMU2ARMPENDINGIT_ER: Pending interrupt detected
|
||||
* @PRCMU_ARMPENDINGIT_ER: Pending interrupt detected
|
||||
*
|
||||
* Different hw accelerators which can be turned ON/
|
||||
* OFF or put into retention (MMDSPs and ESRAMs).
|
||||
* Used with EPOD API.
|
||||
*
|
||||
* NOTE! Deprecated, to be removed when all users switched over to use the
|
||||
* regulator API.
|
||||
*/
|
||||
enum hw_acc_dev {
|
||||
HW_ACC_SVAMMDSP,
|
||||
HW_ACC_SVAPIPE,
|
||||
HW_ACC_SIAMMDSP,
|
||||
HW_ACC_SIAPIPE,
|
||||
HW_ACC_SGA,
|
||||
HW_ACC_B2R2,
|
||||
HW_ACC_MCDE,
|
||||
HW_ACC_ESRAM1,
|
||||
HW_ACC_ESRAM2,
|
||||
HW_ACC_ESRAM3,
|
||||
HW_ACC_ESRAM4,
|
||||
NUM_HW_ACC
|
||||
enum prcmu_power_status {
|
||||
PRCMU_SLEEP_OK = 0xf3,
|
||||
PRCMU_DEEP_SLEEP_OK = 0xf6,
|
||||
PRCMU_IDLE_OK = 0xf0,
|
||||
PRCMU_DEEPIDLE_OK = 0xe3,
|
||||
PRCMU_PRCMU2ARMPENDINGIT_ER = 0x91,
|
||||
PRCMU_ARMPENDINGIT_ER = 0x93,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -493,6 +493,20 @@ struct prcmu_auto_pm_config {
|
||||
u8 sva_policy;
|
||||
};
|
||||
|
||||
#define PRCMU_FW_PROJECT_U8500 2
|
||||
#define PRCMU_FW_PROJECT_U9500 4
|
||||
#define PRCMU_FW_PROJECT_U8500_C2 7
|
||||
#define PRCMU_FW_PROJECT_U9500_C2 11
|
||||
#define PRCMU_FW_PROJECT_U8520 13
|
||||
#define PRCMU_FW_PROJECT_U8420 14
|
||||
|
||||
struct prcmu_fw_version {
|
||||
u8 project;
|
||||
u8 api_version;
|
||||
u8 func_version;
|
||||
u8 errata;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MFD_DB8500_PRCMU
|
||||
|
||||
void db8500_prcmu_early_init(void);
|
||||
@@ -500,42 +514,41 @@ int prcmu_set_rc_a2p(enum romcode_write);
|
||||
enum romcode_read prcmu_get_rc_p2a(void);
|
||||
enum ap_pwrst prcmu_get_xp70_current_state(void);
|
||||
bool prcmu_has_arm_maxopp(void);
|
||||
bool prcmu_is_u8400(void);
|
||||
int prcmu_set_ape_opp(u8 opp);
|
||||
int prcmu_get_ape_opp(void);
|
||||
struct prcmu_fw_version *prcmu_get_fw_version(void);
|
||||
int prcmu_request_ape_opp_100_voltage(bool enable);
|
||||
int prcmu_release_usb_wakeup_state(void);
|
||||
int prcmu_set_ddr_opp(u8 opp);
|
||||
int prcmu_get_ddr_opp(void);
|
||||
/* NOTE! Use regulator framework instead */
|
||||
int prcmu_set_hwacc(u16 hw_acc_dev, u8 state);
|
||||
void prcmu_configure_auto_pm(struct prcmu_auto_pm_config *sleep,
|
||||
struct prcmu_auto_pm_config *idle);
|
||||
bool prcmu_is_auto_pm_enabled(void);
|
||||
|
||||
int prcmu_config_clkout(u8 clkout, u8 source, u8 div);
|
||||
int prcmu_set_clock_divider(u8 clock, u8 divider);
|
||||
int prcmu_config_hotdog(u8 threshold);
|
||||
int prcmu_config_hotmon(u8 low, u8 high);
|
||||
int prcmu_start_temp_sense(u16 cycles32k);
|
||||
int prcmu_stop_temp_sense(void);
|
||||
int db8500_prcmu_config_hotdog(u8 threshold);
|
||||
int db8500_prcmu_config_hotmon(u8 low, u8 high);
|
||||
int db8500_prcmu_start_temp_sense(u16 cycles32k);
|
||||
int db8500_prcmu_stop_temp_sense(void);
|
||||
int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size);
|
||||
int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size);
|
||||
|
||||
void prcmu_ac_wake_req(void);
|
||||
void prcmu_ac_sleep_req(void);
|
||||
void prcmu_modem_reset(void);
|
||||
void prcmu_enable_spi2(void);
|
||||
void prcmu_disable_spi2(void);
|
||||
void db8500_prcmu_modem_reset(void);
|
||||
|
||||
int prcmu_config_a9wdog(u8 num, bool sleep_auto_off);
|
||||
int prcmu_enable_a9wdog(u8 id);
|
||||
int prcmu_disable_a9wdog(u8 id);
|
||||
int prcmu_kick_a9wdog(u8 id);
|
||||
int prcmu_load_a9wdog(u8 id, u32 val);
|
||||
int db8500_prcmu_config_a9wdog(u8 num, bool sleep_auto_off);
|
||||
int db8500_prcmu_enable_a9wdog(u8 id);
|
||||
int db8500_prcmu_disable_a9wdog(u8 id);
|
||||
int db8500_prcmu_kick_a9wdog(u8 id);
|
||||
int db8500_prcmu_load_a9wdog(u8 id, u32 val);
|
||||
|
||||
void db8500_prcmu_system_reset(u16 reset_code);
|
||||
int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll);
|
||||
u8 db8500_prcmu_get_power_state_result(void);
|
||||
int db8500_prcmu_gic_decouple(void);
|
||||
int db8500_prcmu_gic_recouple(void);
|
||||
int db8500_prcmu_copy_gic_settings(void);
|
||||
bool db8500_prcmu_gic_pending_irq(void);
|
||||
bool db8500_prcmu_pending_irq(void);
|
||||
bool db8500_prcmu_is_cpu_in_wfi(int cpu);
|
||||
void db8500_prcmu_enable_wakeups(u32 wakeups);
|
||||
int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state);
|
||||
int db8500_prcmu_request_clock(u8 clock, bool enable);
|
||||
@@ -549,6 +562,14 @@ u16 db8500_prcmu_get_reset_code(void);
|
||||
bool db8500_prcmu_is_ac_wake_requested(void);
|
||||
int db8500_prcmu_set_arm_opp(u8 opp);
|
||||
int db8500_prcmu_get_arm_opp(void);
|
||||
int db8500_prcmu_set_ape_opp(u8 opp);
|
||||
int db8500_prcmu_get_ape_opp(void);
|
||||
int db8500_prcmu_set_ddr_opp(u8 opp);
|
||||
int db8500_prcmu_get_ddr_opp(void);
|
||||
|
||||
u32 db8500_prcmu_read(unsigned int reg);
|
||||
void db8500_prcmu_write(unsigned int reg, u32 value);
|
||||
void db8500_prcmu_write_masked(unsigned int reg, u32 mask, u32 value);
|
||||
|
||||
#else /* !CONFIG_MFD_DB8500_PRCMU */
|
||||
|
||||
@@ -574,17 +595,17 @@ static inline bool prcmu_has_arm_maxopp(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool prcmu_is_u8400(void)
|
||||
static inline struct prcmu_fw_version *prcmu_get_fw_version(void)
|
||||
{
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int prcmu_set_ape_opp(u8 opp)
|
||||
static inline int db8500_prcmu_set_ape_opp(u8 opp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_get_ape_opp(void)
|
||||
static inline int db8500_prcmu_get_ape_opp(void)
|
||||
{
|
||||
return APE_100_OPP;
|
||||
}
|
||||
@@ -599,21 +620,16 @@ static inline int prcmu_release_usb_wakeup_state(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_set_ddr_opp(u8 opp)
|
||||
static inline int db8500_prcmu_set_ddr_opp(u8 opp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_get_ddr_opp(void)
|
||||
static inline int db8500_prcmu_get_ddr_opp(void)
|
||||
{
|
||||
return DDR_100_OPP;
|
||||
}
|
||||
|
||||
static inline int prcmu_set_hwacc(u16 hw_acc_dev, u8 state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void prcmu_configure_auto_pm(struct prcmu_auto_pm_config *sleep,
|
||||
struct prcmu_auto_pm_config *idle)
|
||||
{
|
||||
@@ -634,22 +650,22 @@ static inline int prcmu_set_clock_divider(u8 clock, u8 divider)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_config_hotdog(u8 threshold)
|
||||
static inline int db8500_prcmu_config_hotdog(u8 threshold)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_config_hotmon(u8 low, u8 high)
|
||||
static inline int db8500_prcmu_config_hotmon(u8 low, u8 high)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_start_temp_sense(u16 cycles32k)
|
||||
static inline int db8500_prcmu_start_temp_sense(u16 cycles32k)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_stop_temp_sense(void)
|
||||
static inline int db8500_prcmu_stop_temp_sense(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -668,17 +684,7 @@ static inline void prcmu_ac_wake_req(void) {}
|
||||
|
||||
static inline void prcmu_ac_sleep_req(void) {}
|
||||
|
||||
static inline void prcmu_modem_reset(void) {}
|
||||
|
||||
static inline int prcmu_enable_spi2(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_disable_spi2(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void db8500_prcmu_modem_reset(void) {}
|
||||
|
||||
static inline void db8500_prcmu_system_reset(u16 reset_code) {}
|
||||
|
||||
@@ -688,6 +694,11 @@ static inline int db8500_prcmu_set_power_state(u8 state, bool keep_ulp_clk,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u8 db8500_prcmu_get_power_state_result(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void db8500_prcmu_enable_wakeups(u32 wakeups) {}
|
||||
|
||||
static inline int db8500_prcmu_set_epod(u16 epod_id, u8 epod_state)
|
||||
@@ -729,27 +740,27 @@ static inline u16 db8500_prcmu_get_reset_code(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_config_a9wdog(u8 num, bool sleep_auto_off)
|
||||
static inline int db8500_prcmu_config_a9wdog(u8 num, bool sleep_auto_off)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_enable_a9wdog(u8 id)
|
||||
static inline int db8500_prcmu_enable_a9wdog(u8 id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_disable_a9wdog(u8 id)
|
||||
static inline int db8500_prcmu_disable_a9wdog(u8 id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_kick_a9wdog(u8 id)
|
||||
static inline int db8500_prcmu_kick_a9wdog(u8 id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_load_a9wdog(u8 id, u32 val)
|
||||
static inline int db8500_prcmu_load_a9wdog(u8 id, u32 val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -769,6 +780,16 @@ static inline int db8500_prcmu_get_arm_opp(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u32 db8500_prcmu_read(unsigned int reg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void db8500_prcmu_write(unsigned int reg, u32 value) {}
|
||||
|
||||
static inline void db8500_prcmu_write_masked(unsigned int reg, u32 mask,
|
||||
u32 value) {}
|
||||
|
||||
#endif /* !CONFIG_MFD_DB8500_PRCMU */
|
||||
|
||||
#endif /* __MFD_DB8500_PRCMU_H */
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
/* PRCMU Wakeup defines */
|
||||
enum prcmu_wakeup_index {
|
||||
@@ -80,6 +80,29 @@ enum prcmu_wakeup_index {
|
||||
#define EPOD_STATE_ON_CLK_OFF 0x03
|
||||
#define EPOD_STATE_ON 0x04
|
||||
|
||||
/* DB5500 CLKOUT IDs */
|
||||
enum {
|
||||
DB5500_CLKOUT0 = 0,
|
||||
DB5500_CLKOUT1,
|
||||
};
|
||||
|
||||
/* DB5500 CLKOUTx sources */
|
||||
enum {
|
||||
DB5500_CLKOUT_REF_CLK_SEL0,
|
||||
DB5500_CLKOUT_RTC_CLK0_SEL0,
|
||||
DB5500_CLKOUT_ULP_CLK_SEL0,
|
||||
DB5500_CLKOUT_STATIC0,
|
||||
DB5500_CLKOUT_REFCLK,
|
||||
DB5500_CLKOUT_ULPCLK,
|
||||
DB5500_CLKOUT_ARMCLK,
|
||||
DB5500_CLKOUT_SYSACC0CLK,
|
||||
DB5500_CLKOUT_SOC0PLLCLK,
|
||||
DB5500_CLKOUT_SOC1PLLCLK,
|
||||
DB5500_CLKOUT_DDRPLLCLK,
|
||||
DB5500_CLKOUT_TVCLK,
|
||||
DB5500_CLKOUT_IRDACLK,
|
||||
};
|
||||
|
||||
/*
|
||||
* CLKOUT sources
|
||||
*/
|
||||
@@ -111,6 +134,7 @@ enum prcmu_clock {
|
||||
PRCMU_MSP1CLK,
|
||||
PRCMU_I2CCLK,
|
||||
PRCMU_SDMMCCLK,
|
||||
PRCMU_SPARE1CLK,
|
||||
PRCMU_SLIMCLK,
|
||||
PRCMU_PER1CLK,
|
||||
PRCMU_PER2CLK,
|
||||
@@ -139,12 +163,20 @@ enum prcmu_clock {
|
||||
PRCMU_IRRCCLK,
|
||||
PRCMU_SIACLK,
|
||||
PRCMU_SVACLK,
|
||||
PRCMU_ACLK,
|
||||
PRCMU_NUM_REG_CLOCKS,
|
||||
PRCMU_SYSCLK = PRCMU_NUM_REG_CLOCKS,
|
||||
PRCMU_CDCLK,
|
||||
PRCMU_TIMCLK,
|
||||
PRCMU_PLLSOC0,
|
||||
PRCMU_PLLSOC1,
|
||||
PRCMU_PLLDDR,
|
||||
PRCMU_PLLDSI,
|
||||
PRCMU_DSI0CLK,
|
||||
PRCMU_DSI1CLK,
|
||||
PRCMU_DSI0ESCCLK,
|
||||
PRCMU_DSI1ESCCLK,
|
||||
PRCMU_DSI2ESCCLK,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -153,12 +185,14 @@ enum prcmu_clock {
|
||||
* @APE_NO_CHANGE: The APE operating point is unchanged
|
||||
* @APE_100_OPP: The new APE operating point is ape100opp
|
||||
* @APE_50_OPP: 50%
|
||||
* @APE_50_PARTLY_25_OPP: 50%, except some clocks at 25%.
|
||||
*/
|
||||
enum ape_opp {
|
||||
APE_OPP_INIT = 0x00,
|
||||
APE_NO_CHANGE = 0x01,
|
||||
APE_100_OPP = 0x02,
|
||||
APE_50_OPP = 0x03
|
||||
APE_50_OPP = 0x03,
|
||||
APE_50_PARTLY_25_OPP = 0xFF,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -218,9 +252,11 @@ enum ddr_pwrst {
|
||||
|
||||
#if defined(CONFIG_UX500_SOC_DB8500) || defined(CONFIG_UX500_SOC_DB5500)
|
||||
|
||||
#include <mach/id.h>
|
||||
|
||||
static inline void __init prcmu_early_init(void)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return db5500_prcmu_early_init();
|
||||
else
|
||||
return db8500_prcmu_early_init();
|
||||
@@ -229,7 +265,7 @@ static inline void __init prcmu_early_init(void)
|
||||
static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk,
|
||||
bool keep_ap_pll)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return db5500_prcmu_set_power_state(state, keep_ulp_clk,
|
||||
keep_ap_pll);
|
||||
else
|
||||
@@ -237,9 +273,65 @@ static inline int prcmu_set_power_state(u8 state, bool keep_ulp_clk,
|
||||
keep_ap_pll);
|
||||
}
|
||||
|
||||
static inline u8 prcmu_get_power_state_result(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_get_power_state_result();
|
||||
}
|
||||
|
||||
static inline int prcmu_gic_decouple(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_gic_decouple();
|
||||
}
|
||||
|
||||
static inline int prcmu_gic_recouple(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_gic_recouple();
|
||||
}
|
||||
|
||||
static inline bool prcmu_gic_pending_irq(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_gic_pending_irq();
|
||||
}
|
||||
|
||||
static inline bool prcmu_is_cpu_in_wfi(int cpu)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_is_cpu_in_wfi(cpu);
|
||||
}
|
||||
|
||||
static inline int prcmu_copy_gic_settings(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_copy_gic_settings();
|
||||
}
|
||||
|
||||
static inline bool prcmu_pending_irq(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_pending_irq();
|
||||
}
|
||||
|
||||
static inline int prcmu_set_epod(u16 epod_id, u8 epod_state)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_set_epod(epod_id, epod_state);
|
||||
@@ -247,7 +339,7 @@ static inline int prcmu_set_epod(u16 epod_id, u8 epod_state)
|
||||
|
||||
static inline void prcmu_enable_wakeups(u32 wakeups)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
db5500_prcmu_enable_wakeups(wakeups);
|
||||
else
|
||||
db8500_prcmu_enable_wakeups(wakeups);
|
||||
@@ -260,7 +352,7 @@ static inline void prcmu_disable_wakeups(void)
|
||||
|
||||
static inline void prcmu_config_abb_event_readout(u32 abb_events)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
db5500_prcmu_config_abb_event_readout(abb_events);
|
||||
else
|
||||
db8500_prcmu_config_abb_event_readout(abb_events);
|
||||
@@ -268,7 +360,7 @@ static inline void prcmu_config_abb_event_readout(u32 abb_events)
|
||||
|
||||
static inline void prcmu_get_abb_event_buffer(void __iomem **buf)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
db5500_prcmu_get_abb_event_buffer(buf);
|
||||
else
|
||||
db8500_prcmu_get_abb_event_buffer(buf);
|
||||
@@ -276,25 +368,40 @@ static inline void prcmu_get_abb_event_buffer(void __iomem **buf)
|
||||
|
||||
int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size);
|
||||
int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size);
|
||||
int prcmu_abb_write_masked(u8 slave, u8 reg, u8 *value, u8 *mask, u8 size);
|
||||
|
||||
int prcmu_config_clkout(u8 clkout, u8 source, u8 div);
|
||||
|
||||
static inline int prcmu_request_clock(u8 clock, bool enable)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return db5500_prcmu_request_clock(clock, enable);
|
||||
else
|
||||
return db8500_prcmu_request_clock(clock, enable);
|
||||
}
|
||||
|
||||
int prcmu_set_ape_opp(u8 opp);
|
||||
int prcmu_get_ape_opp(void);
|
||||
int prcmu_set_ddr_opp(u8 opp);
|
||||
int prcmu_get_ddr_opp(void);
|
||||
unsigned long prcmu_clock_rate(u8 clock);
|
||||
long prcmu_round_clock_rate(u8 clock, unsigned long rate);
|
||||
int prcmu_set_clock_rate(u8 clock, unsigned long rate);
|
||||
|
||||
static inline int prcmu_set_ddr_opp(u8 opp)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_set_ddr_opp(opp);
|
||||
}
|
||||
static inline int prcmu_get_ddr_opp(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_get_ddr_opp();
|
||||
}
|
||||
|
||||
static inline int prcmu_set_arm_opp(u8 opp)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_set_arm_opp(opp);
|
||||
@@ -302,15 +409,31 @@ static inline int prcmu_set_arm_opp(u8 opp)
|
||||
|
||||
static inline int prcmu_get_arm_opp(void)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_get_arm_opp();
|
||||
}
|
||||
|
||||
static inline int prcmu_set_ape_opp(u8 opp)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_set_ape_opp(opp);
|
||||
}
|
||||
|
||||
static inline int prcmu_get_ape_opp(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_get_ape_opp();
|
||||
}
|
||||
|
||||
static inline void prcmu_system_reset(u16 reset_code)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return db5500_prcmu_system_reset(reset_code);
|
||||
else
|
||||
return db8500_prcmu_system_reset(reset_code);
|
||||
@@ -318,7 +441,7 @@ static inline void prcmu_system_reset(u16 reset_code)
|
||||
|
||||
static inline u16 prcmu_get_reset_code(void)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return db5500_prcmu_get_reset_code();
|
||||
else
|
||||
return db8500_prcmu_get_reset_code();
|
||||
@@ -326,10 +449,17 @@ static inline u16 prcmu_get_reset_code(void)
|
||||
|
||||
void prcmu_ac_wake_req(void);
|
||||
void prcmu_ac_sleep_req(void);
|
||||
void prcmu_modem_reset(void);
|
||||
static inline void prcmu_modem_reset(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return;
|
||||
else
|
||||
return db8500_prcmu_modem_reset();
|
||||
}
|
||||
|
||||
static inline bool prcmu_is_ac_wake_requested(void)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return db5500_prcmu_is_ac_wake_requested();
|
||||
else
|
||||
return db8500_prcmu_is_ac_wake_requested();
|
||||
@@ -337,7 +467,7 @@ static inline bool prcmu_is_ac_wake_requested(void)
|
||||
|
||||
static inline int prcmu_set_display_clocks(void)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return db5500_prcmu_set_display_clocks();
|
||||
else
|
||||
return db8500_prcmu_set_display_clocks();
|
||||
@@ -345,7 +475,7 @@ static inline int prcmu_set_display_clocks(void)
|
||||
|
||||
static inline int prcmu_disable_dsipll(void)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return db5500_prcmu_disable_dsipll();
|
||||
else
|
||||
return db8500_prcmu_disable_dsipll();
|
||||
@@ -353,7 +483,7 @@ static inline int prcmu_disable_dsipll(void)
|
||||
|
||||
static inline int prcmu_enable_dsipll(void)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return db5500_prcmu_enable_dsipll();
|
||||
else
|
||||
return db8500_prcmu_enable_dsipll();
|
||||
@@ -361,11 +491,107 @@ static inline int prcmu_enable_dsipll(void)
|
||||
|
||||
static inline int prcmu_config_esram0_deep_sleep(u8 state)
|
||||
{
|
||||
if (machine_is_u5500())
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_config_esram0_deep_sleep(state);
|
||||
}
|
||||
|
||||
static inline int prcmu_config_hotdog(u8 threshold)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_config_hotdog(threshold);
|
||||
}
|
||||
|
||||
static inline int prcmu_config_hotmon(u8 low, u8 high)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_config_hotmon(low, high);
|
||||
}
|
||||
|
||||
static inline int prcmu_start_temp_sense(u16 cycles32k)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_start_temp_sense(cycles32k);
|
||||
}
|
||||
|
||||
static inline int prcmu_stop_temp_sense(void)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_stop_temp_sense();
|
||||
}
|
||||
|
||||
static inline u32 prcmu_read(unsigned int reg)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_read(reg);
|
||||
}
|
||||
|
||||
static inline void prcmu_write(unsigned int reg, u32 value)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return;
|
||||
else
|
||||
db8500_prcmu_write(reg, value);
|
||||
}
|
||||
|
||||
static inline void prcmu_write_masked(unsigned int reg, u32 mask, u32 value)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return;
|
||||
else
|
||||
db8500_prcmu_write_masked(reg, mask, value);
|
||||
}
|
||||
|
||||
static inline int prcmu_enable_a9wdog(u8 id)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_enable_a9wdog(id);
|
||||
}
|
||||
|
||||
static inline int prcmu_disable_a9wdog(u8 id)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_disable_a9wdog(id);
|
||||
}
|
||||
|
||||
static inline int prcmu_kick_a9wdog(u8 id)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_kick_a9wdog(id);
|
||||
}
|
||||
|
||||
static inline int prcmu_load_a9wdog(u8 id, u32 timeout)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_load_a9wdog(id, timeout);
|
||||
}
|
||||
|
||||
static inline int prcmu_config_a9wdog(u8 num, bool sleep_auto_off)
|
||||
{
|
||||
if (cpu_is_u5500())
|
||||
return -EINVAL;
|
||||
else
|
||||
return db8500_prcmu_config_a9wdog(num, sleep_auto_off);
|
||||
}
|
||||
#else
|
||||
|
||||
static inline void __init prcmu_early_init(void) {}
|
||||
@@ -395,6 +621,12 @@ static inline int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size)
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int prcmu_abb_write_masked(u8 slave, u8 reg, u8 *value, u8 *mask,
|
||||
u8 size)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int prcmu_config_clkout(u8 clkout, u8 source, u8 div)
|
||||
{
|
||||
return 0;
|
||||
@@ -405,6 +637,21 @@ static inline int prcmu_request_clock(u8 clock, bool enable)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline long prcmu_round_clock_rate(u8 clock, unsigned long rate)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_set_clock_rate(u8 clock, unsigned long rate)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned long prcmu_clock_rate(u8 clock)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_set_ape_opp(u8 opp)
|
||||
{
|
||||
return 0;
|
||||
@@ -480,14 +727,133 @@ static inline void prcmu_get_abb_event_buffer(void __iomem **buf)
|
||||
*buf = NULL;
|
||||
}
|
||||
|
||||
static inline int prcmu_config_hotdog(u8 threshold)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_config_hotmon(u8 low, u8 high)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_start_temp_sense(u16 cycles32k)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int prcmu_stop_temp_sense(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u32 prcmu_read(unsigned int reg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void prcmu_write(unsigned int reg, u32 value) {}
|
||||
|
||||
static inline void prcmu_write_masked(unsigned int reg, u32 mask, u32 value) {}
|
||||
|
||||
#endif
|
||||
|
||||
static inline void prcmu_set(unsigned int reg, u32 bits)
|
||||
{
|
||||
prcmu_write_masked(reg, bits, bits);
|
||||
}
|
||||
|
||||
static inline void prcmu_clear(unsigned int reg, u32 bits)
|
||||
{
|
||||
prcmu_write_masked(reg, bits, 0);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_UX500_SOC_DB8500) || defined(CONFIG_UX500_SOC_DB5500)
|
||||
|
||||
/**
|
||||
* prcmu_enable_spi2 - Enables pin muxing for SPI2 on OtherAlternateC1.
|
||||
*/
|
||||
static inline void prcmu_enable_spi2(void)
|
||||
{
|
||||
if (cpu_is_u8500())
|
||||
prcmu_set(DB8500_PRCM_GPIOCR, DB8500_PRCM_GPIOCR_SPI2_SELECT);
|
||||
}
|
||||
|
||||
/**
|
||||
* prcmu_disable_spi2 - Disables pin muxing for SPI2 on OtherAlternateC1.
|
||||
*/
|
||||
static inline void prcmu_disable_spi2(void)
|
||||
{
|
||||
if (cpu_is_u8500())
|
||||
prcmu_clear(DB8500_PRCM_GPIOCR, DB8500_PRCM_GPIOCR_SPI2_SELECT);
|
||||
}
|
||||
|
||||
/**
|
||||
* prcmu_enable_stm_mod_uart - Enables pin muxing for STMMOD
|
||||
* and UARTMOD on OtherAlternateC3.
|
||||
*/
|
||||
static inline void prcmu_enable_stm_mod_uart(void)
|
||||
{
|
||||
if (cpu_is_u8500()) {
|
||||
prcmu_set(DB8500_PRCM_GPIOCR,
|
||||
(DB8500_PRCM_GPIOCR_DBG_STM_MOD_CMD1 |
|
||||
DB8500_PRCM_GPIOCR_DBG_UARTMOD_CMD0));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* prcmu_disable_stm_mod_uart - Disables pin muxing for STMMOD
|
||||
* and UARTMOD on OtherAlternateC3.
|
||||
*/
|
||||
static inline void prcmu_disable_stm_mod_uart(void)
|
||||
{
|
||||
if (cpu_is_u8500()) {
|
||||
prcmu_clear(DB8500_PRCM_GPIOCR,
|
||||
(DB8500_PRCM_GPIOCR_DBG_STM_MOD_CMD1 |
|
||||
DB8500_PRCM_GPIOCR_DBG_UARTMOD_CMD0));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* prcmu_enable_stm_ape - Enables pin muxing for STM APE on OtherAlternateC1.
|
||||
*/
|
||||
static inline void prcmu_enable_stm_ape(void)
|
||||
{
|
||||
if (cpu_is_u8500()) {
|
||||
prcmu_set(DB8500_PRCM_GPIOCR,
|
||||
DB8500_PRCM_GPIOCR_DBG_STM_APE_CMD);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* prcmu_disable_stm_ape - Disables pin muxing for STM APE on OtherAlternateC1.
|
||||
*/
|
||||
static inline void prcmu_disable_stm_ape(void)
|
||||
{
|
||||
if (cpu_is_u8500()) {
|
||||
prcmu_clear(DB8500_PRCM_GPIOCR,
|
||||
DB8500_PRCM_GPIOCR_DBG_STM_APE_CMD);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void prcmu_enable_spi2(void) {}
|
||||
static inline void prcmu_disable_spi2(void) {}
|
||||
static inline void prcmu_enable_stm_mod_uart(void) {}
|
||||
static inline void prcmu_disable_stm_mod_uart(void) {}
|
||||
static inline void prcmu_enable_stm_ape(void) {}
|
||||
static inline void prcmu_disable_stm_ape(void) {}
|
||||
|
||||
#endif
|
||||
|
||||
/* PRCMU QoS APE OPP class */
|
||||
#define PRCMU_QOS_APE_OPP 1
|
||||
#define PRCMU_QOS_DDR_OPP 2
|
||||
#define PRCMU_QOS_ARM_OPP 3
|
||||
#define PRCMU_QOS_DEFAULT_VALUE -1
|
||||
|
||||
#ifdef CONFIG_UX500_PRCMU_QOS_POWER
|
||||
#ifdef CONFIG_DBX500_PRCMU_QOS_POWER
|
||||
|
||||
unsigned long prcmu_qos_get_cpufreq_opp_delay(void);
|
||||
void prcmu_qos_set_cpufreq_opp_delay(unsigned long);
|
||||
|
||||
@@ -38,7 +38,8 @@ int mc13xxx_irq_ack(struct mc13xxx *mc13xxx, int irq);
|
||||
int mc13xxx_get_flags(struct mc13xxx *mc13xxx);
|
||||
|
||||
int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx,
|
||||
unsigned int mode, unsigned int channel, unsigned int *sample);
|
||||
unsigned int mode, unsigned int channel,
|
||||
u8 ato, bool atox, unsigned int *sample);
|
||||
|
||||
#define MC13XXX_IRQ_ADCDONE 0
|
||||
#define MC13XXX_IRQ_ADCBISDONE 1
|
||||
@@ -157,6 +158,18 @@ struct mc13xxx_buttons_platform_data {
|
||||
unsigned short b3on_key;
|
||||
};
|
||||
|
||||
struct mc13xxx_ts_platform_data {
|
||||
/* Delay between Touchscreen polarization and ADC Conversion.
|
||||
* Given in clock ticks of a 32 kHz clock which gives a granularity of
|
||||
* about 30.5ms */
|
||||
u8 ato;
|
||||
|
||||
#define MC13783_TS_ATO_FIRST false
|
||||
#define MC13783_TS_ATO_EACH true
|
||||
/* Use the ATO delay only for the first conversion or for each one */
|
||||
bool atox;
|
||||
};
|
||||
|
||||
struct mc13xxx_platform_data {
|
||||
#define MC13XXX_USE_TOUCHSCREEN (1 << 0)
|
||||
#define MC13XXX_USE_CODEC (1 << 1)
|
||||
@@ -167,6 +180,7 @@ struct mc13xxx_platform_data {
|
||||
struct mc13xxx_regulator_platform_data regulators;
|
||||
struct mc13xxx_leds_platform_data *leds;
|
||||
struct mc13xxx_buttons_platform_data *buttons;
|
||||
struct mc13xxx_ts_platform_data touch;
|
||||
};
|
||||
|
||||
#define MC13XXX_ADC_MODE_TS 1
|
||||
|
||||
+3
-11
@@ -10,8 +10,6 @@
|
||||
#ifndef MCP_H
|
||||
#define MCP_H
|
||||
|
||||
#include <mach/dma.h>
|
||||
|
||||
struct mcp_ops;
|
||||
|
||||
struct mcp {
|
||||
@@ -21,12 +19,7 @@ struct mcp {
|
||||
int use_count;
|
||||
unsigned int sclk_rate;
|
||||
unsigned int rw_timeout;
|
||||
dma_device_t dma_audio_rd;
|
||||
dma_device_t dma_audio_wr;
|
||||
dma_device_t dma_telco_rd;
|
||||
dma_device_t dma_telco_wr;
|
||||
struct device attached_device;
|
||||
int gpio_base;
|
||||
};
|
||||
|
||||
struct mcp_ops {
|
||||
@@ -47,15 +40,14 @@ void mcp_disable(struct mcp *);
|
||||
#define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate)
|
||||
|
||||
struct mcp *mcp_host_alloc(struct device *, size_t);
|
||||
int mcp_host_register(struct mcp *);
|
||||
void mcp_host_unregister(struct mcp *);
|
||||
int mcp_host_add(struct mcp *, void *);
|
||||
void mcp_host_del(struct mcp *);
|
||||
void mcp_host_free(struct mcp *);
|
||||
|
||||
struct mcp_driver {
|
||||
struct device_driver drv;
|
||||
int (*probe)(struct mcp *);
|
||||
void (*remove)(struct mcp *);
|
||||
int (*suspend)(struct mcp *, pm_message_t);
|
||||
int (*resume)(struct mcp *);
|
||||
};
|
||||
|
||||
int mcp_driver_register(struct mcp_driver *);
|
||||
|
||||
@@ -0,0 +1,295 @@
|
||||
/*
|
||||
* Core driver interface to access RICOH_RC5T583 power management chip.
|
||||
*
|
||||
* Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved.
|
||||
* Author: Laxman dewangan <ldewangan@nvidia.com>
|
||||
*
|
||||
* Based on code
|
||||
* Copyright (C) 2011 RICOH COMPANY,LTD
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_MFD_RC5T583_H
|
||||
#define __LINUX_MFD_RC5T583_H
|
||||
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define RC5T583_MAX_REGS 0xF8
|
||||
|
||||
/* Maximum number of main interrupts */
|
||||
#define MAX_MAIN_INTERRUPT 5
|
||||
#define RC5T583_MAX_GPEDGE_REG 2
|
||||
#define RC5T583_MAX_INTERRUPT_MASK_REGS 9
|
||||
|
||||
/* Interrupt enable register */
|
||||
#define RC5T583_INT_EN_SYS1 0x19
|
||||
#define RC5T583_INT_EN_SYS2 0x1D
|
||||
#define RC5T583_INT_EN_DCDC 0x41
|
||||
#define RC5T583_INT_EN_RTC 0xED
|
||||
#define RC5T583_INT_EN_ADC1 0x90
|
||||
#define RC5T583_INT_EN_ADC2 0x91
|
||||
#define RC5T583_INT_EN_ADC3 0x92
|
||||
|
||||
/* Interrupt status registers (monitor regs in Ricoh)*/
|
||||
#define RC5T583_INTC_INTPOL 0xAD
|
||||
#define RC5T583_INTC_INTEN 0xAE
|
||||
#define RC5T583_INTC_INTMON 0xAF
|
||||
|
||||
#define RC5T583_INT_MON_GRP 0xAF
|
||||
#define RC5T583_INT_MON_SYS1 0x1B
|
||||
#define RC5T583_INT_MON_SYS2 0x1F
|
||||
#define RC5T583_INT_MON_DCDC 0x43
|
||||
#define RC5T583_INT_MON_RTC 0xEE
|
||||
|
||||
/* Interrupt clearing registers */
|
||||
#define RC5T583_INT_IR_SYS1 0x1A
|
||||
#define RC5T583_INT_IR_SYS2 0x1E
|
||||
#define RC5T583_INT_IR_DCDC 0x42
|
||||
#define RC5T583_INT_IR_RTC 0xEE
|
||||
#define RC5T583_INT_IR_ADCL 0x94
|
||||
#define RC5T583_INT_IR_ADCH 0x95
|
||||
#define RC5T583_INT_IR_ADCEND 0x96
|
||||
#define RC5T583_INT_IR_GPIOR 0xA9
|
||||
#define RC5T583_INT_IR_GPIOF 0xAA
|
||||
|
||||
/* Sleep sequence registers */
|
||||
#define RC5T583_SLPSEQ1 0x21
|
||||
#define RC5T583_SLPSEQ2 0x22
|
||||
#define RC5T583_SLPSEQ3 0x23
|
||||
#define RC5T583_SLPSEQ4 0x24
|
||||
#define RC5T583_SLPSEQ5 0x25
|
||||
#define RC5T583_SLPSEQ6 0x26
|
||||
#define RC5T583_SLPSEQ7 0x27
|
||||
#define RC5T583_SLPSEQ8 0x28
|
||||
#define RC5T583_SLPSEQ9 0x29
|
||||
#define RC5T583_SLPSEQ10 0x2A
|
||||
#define RC5T583_SLPSEQ11 0x2B
|
||||
|
||||
/* Regulator registers */
|
||||
#define RC5T583_REG_DC0CTL 0x30
|
||||
#define RC5T583_REG_DC0DAC 0x31
|
||||
#define RC5T583_REG_DC0LATCTL 0x32
|
||||
#define RC5T583_REG_SR0CTL 0x33
|
||||
|
||||
#define RC5T583_REG_DC1CTL 0x34
|
||||
#define RC5T583_REG_DC1DAC 0x35
|
||||
#define RC5T583_REG_DC1LATCTL 0x36
|
||||
#define RC5T583_REG_SR1CTL 0x37
|
||||
|
||||
#define RC5T583_REG_DC2CTL 0x38
|
||||
#define RC5T583_REG_DC2DAC 0x39
|
||||
#define RC5T583_REG_DC2LATCTL 0x3A
|
||||
#define RC5T583_REG_SR2CTL 0x3B
|
||||
|
||||
#define RC5T583_REG_DC3CTL 0x3C
|
||||
#define RC5T583_REG_DC3DAC 0x3D
|
||||
#define RC5T583_REG_DC3LATCTL 0x3E
|
||||
#define RC5T583_REG_SR3CTL 0x3F
|
||||
|
||||
|
||||
#define RC5T583_REG_LDOEN1 0x50
|
||||
#define RC5T583_REG_LDOEN2 0x51
|
||||
#define RC5T583_REG_LDODIS1 0x52
|
||||
#define RC5T583_REG_LDODIS2 0x53
|
||||
|
||||
#define RC5T583_REG_LDO0DAC 0x54
|
||||
#define RC5T583_REG_LDO1DAC 0x55
|
||||
#define RC5T583_REG_LDO2DAC 0x56
|
||||
#define RC5T583_REG_LDO3DAC 0x57
|
||||
#define RC5T583_REG_LDO4DAC 0x58
|
||||
#define RC5T583_REG_LDO5DAC 0x59
|
||||
#define RC5T583_REG_LDO6DAC 0x5A
|
||||
#define RC5T583_REG_LDO7DAC 0x5B
|
||||
#define RC5T583_REG_LDO8DAC 0x5C
|
||||
#define RC5T583_REG_LDO9DAC 0x5D
|
||||
|
||||
#define RC5T583_REG_DC0DAC_DS 0x60
|
||||
#define RC5T583_REG_DC1DAC_DS 0x61
|
||||
#define RC5T583_REG_DC2DAC_DS 0x62
|
||||
#define RC5T583_REG_DC3DAC_DS 0x63
|
||||
|
||||
#define RC5T583_REG_LDO0DAC_DS 0x64
|
||||
#define RC5T583_REG_LDO1DAC_DS 0x65
|
||||
#define RC5T583_REG_LDO2DAC_DS 0x66
|
||||
#define RC5T583_REG_LDO3DAC_DS 0x67
|
||||
#define RC5T583_REG_LDO4DAC_DS 0x68
|
||||
#define RC5T583_REG_LDO5DAC_DS 0x69
|
||||
#define RC5T583_REG_LDO6DAC_DS 0x6A
|
||||
#define RC5T583_REG_LDO7DAC_DS 0x6B
|
||||
#define RC5T583_REG_LDO8DAC_DS 0x6C
|
||||
#define RC5T583_REG_LDO9DAC_DS 0x6D
|
||||
|
||||
/* GPIO register base address */
|
||||
#define RC5T583_GPIO_IOSEL 0xA0
|
||||
#define RC5T583_GPIO_PDEN 0xA1
|
||||
#define RC5T583_GPIO_IOOUT 0xA2
|
||||
#define RC5T583_GPIO_PGSEL 0xA3
|
||||
#define RC5T583_GPIO_GPINV 0xA4
|
||||
#define RC5T583_GPIO_GPDEB 0xA5
|
||||
#define RC5T583_GPIO_GPEDGE1 0xA6
|
||||
#define RC5T583_GPIO_GPEDGE2 0xA7
|
||||
#define RC5T583_GPIO_EN_INT 0xA8
|
||||
#define RC5T583_GPIO_MON_IOIN 0xAB
|
||||
#define RC5T583_GPIO_GPOFUNC 0xAC
|
||||
|
||||
/* RICOH_RC5T583 IRQ definitions */
|
||||
enum {
|
||||
RC5T583_IRQ_ONKEY,
|
||||
RC5T583_IRQ_ACOK,
|
||||
RC5T583_IRQ_LIDOPEN,
|
||||
RC5T583_IRQ_PREOT,
|
||||
RC5T583_IRQ_CLKSTP,
|
||||
RC5T583_IRQ_ONKEY_OFF,
|
||||
RC5T583_IRQ_WD,
|
||||
RC5T583_IRQ_EN_PWRREQ1,
|
||||
RC5T583_IRQ_EN_PWRREQ2,
|
||||
RC5T583_IRQ_PRE_VINDET,
|
||||
|
||||
RC5T583_IRQ_DC0LIM,
|
||||
RC5T583_IRQ_DC1LIM,
|
||||
RC5T583_IRQ_DC2LIM,
|
||||
RC5T583_IRQ_DC3LIM,
|
||||
|
||||
RC5T583_IRQ_CTC,
|
||||
RC5T583_IRQ_YALE,
|
||||
RC5T583_IRQ_DALE,
|
||||
RC5T583_IRQ_WALE,
|
||||
|
||||
RC5T583_IRQ_AIN1L,
|
||||
RC5T583_IRQ_AIN2L,
|
||||
RC5T583_IRQ_AIN3L,
|
||||
RC5T583_IRQ_VBATL,
|
||||
RC5T583_IRQ_VIN3L,
|
||||
RC5T583_IRQ_VIN8L,
|
||||
RC5T583_IRQ_AIN1H,
|
||||
RC5T583_IRQ_AIN2H,
|
||||
RC5T583_IRQ_AIN3H,
|
||||
RC5T583_IRQ_VBATH,
|
||||
RC5T583_IRQ_VIN3H,
|
||||
RC5T583_IRQ_VIN8H,
|
||||
RC5T583_IRQ_ADCEND,
|
||||
|
||||
RC5T583_IRQ_GPIO0,
|
||||
RC5T583_IRQ_GPIO1,
|
||||
RC5T583_IRQ_GPIO2,
|
||||
RC5T583_IRQ_GPIO3,
|
||||
RC5T583_IRQ_GPIO4,
|
||||
RC5T583_IRQ_GPIO5,
|
||||
RC5T583_IRQ_GPIO6,
|
||||
RC5T583_IRQ_GPIO7,
|
||||
|
||||
/* Should be last entry */
|
||||
RC5T583_MAX_IRQS,
|
||||
};
|
||||
|
||||
/* Ricoh583 gpio definitions */
|
||||
enum {
|
||||
RC5T583_GPIO0,
|
||||
RC5T583_GPIO1,
|
||||
RC5T583_GPIO2,
|
||||
RC5T583_GPIO3,
|
||||
RC5T583_GPIO4,
|
||||
RC5T583_GPIO5,
|
||||
RC5T583_GPIO6,
|
||||
RC5T583_GPIO7,
|
||||
|
||||
/* Should be last entry */
|
||||
RC5T583_MAX_GPIO,
|
||||
};
|
||||
|
||||
enum {
|
||||
RC5T583_DS_NONE,
|
||||
RC5T583_DS_DC0,
|
||||
RC5T583_DS_DC1,
|
||||
RC5T583_DS_DC2,
|
||||
RC5T583_DS_DC3,
|
||||
RC5T583_DS_LDO0,
|
||||
RC5T583_DS_LDO1,
|
||||
RC5T583_DS_LDO2,
|
||||
RC5T583_DS_LDO3,
|
||||
RC5T583_DS_LDO4,
|
||||
RC5T583_DS_LDO5,
|
||||
RC5T583_DS_LDO6,
|
||||
RC5T583_DS_LDO7,
|
||||
RC5T583_DS_LDO8,
|
||||
RC5T583_DS_LDO9,
|
||||
RC5T583_DS_PSO0,
|
||||
RC5T583_DS_PSO1,
|
||||
RC5T583_DS_PSO2,
|
||||
RC5T583_DS_PSO3,
|
||||
RC5T583_DS_PSO4,
|
||||
RC5T583_DS_PSO5,
|
||||
RC5T583_DS_PSO6,
|
||||
RC5T583_DS_PSO7,
|
||||
|
||||
/* Should be last entry */
|
||||
RC5T583_DS_MAX,
|
||||
};
|
||||
|
||||
/*
|
||||
* Ricoh pmic RC5T583 supports sleep through two external controls.
|
||||
* The output of gpios and regulator can be enable/disable through
|
||||
* this external signals.
|
||||
*/
|
||||
enum {
|
||||
RC5T583_EXT_PWRREQ1_CONTROL = 0x1,
|
||||
RC5T583_EXT_PWRREQ2_CONTROL = 0x2,
|
||||
};
|
||||
|
||||
struct rc5t583 {
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
int chip_irq;
|
||||
int irq_base;
|
||||
struct mutex irq_lock;
|
||||
unsigned long group_irq_en[MAX_MAIN_INTERRUPT];
|
||||
|
||||
/* For main interrupt bits in INTC */
|
||||
uint8_t intc_inten_reg;
|
||||
|
||||
/* For group interrupt bits and address */
|
||||
uint8_t irq_en_reg[RC5T583_MAX_INTERRUPT_MASK_REGS];
|
||||
|
||||
/* For gpio edge */
|
||||
uint8_t gpedge_reg[RC5T583_MAX_GPEDGE_REG];
|
||||
};
|
||||
|
||||
/*
|
||||
* rc5t583_platform_data: Platform data for ricoh rc5t583 pmu.
|
||||
* The board specific data is provided through this structure.
|
||||
* @irq_base: Irq base number on which this device registers their interrupts.
|
||||
* @enable_shutdown: Enable shutdown through the input pin "shutdown".
|
||||
*/
|
||||
|
||||
struct rc5t583_platform_data {
|
||||
int irq_base;
|
||||
bool enable_shutdown;
|
||||
};
|
||||
|
||||
int rc5t583_write(struct device *dev, u8 reg, uint8_t val);
|
||||
int rc5t583_read(struct device *dev, uint8_t reg, uint8_t *val);
|
||||
int rc5t583_set_bits(struct device *dev, unsigned int reg,
|
||||
unsigned int bit_mask);
|
||||
int rc5t583_clear_bits(struct device *dev, unsigned int reg,
|
||||
unsigned int bit_mask);
|
||||
int rc5t583_update(struct device *dev, unsigned int reg,
|
||||
unsigned int val, unsigned int mask);
|
||||
int rc5t583_ext_power_req_config(struct device *dev, int deepsleep_id,
|
||||
int ext_pwr_req, int deepsleep_slot_nr);
|
||||
int rc5t583_irq_init(struct rc5t583 *rc5t583, int irq, int irq_base);
|
||||
int rc5t583_irq_exit(struct rc5t583 *rc5t583);
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user