Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
platform
x86
intel_scu_ipcutil.c
Go to the documentation of this file.
1
/*
2
* intel_scu_ipc.c: Driver for the Intel SCU IPC mechanism
3
*
4
* (C) Copyright 2008-2010 Intel Corporation
5
* Author: Sreedhara DS (
[email protected]
)
6
*
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; version 2
10
* of the License.
11
*
12
* This driver provides ioctl interfaces to call intel scu ipc driver api
13
*/
14
15
#include <linux/module.h>
16
#include <linux/kernel.h>
17
#include <linux/errno.h>
18
#include <linux/types.h>
19
#include <linux/fs.h>
20
#include <linux/fcntl.h>
21
#include <linux/sched.h>
22
#include <
linux/uaccess.h
>
23
#include <linux/slab.h>
24
#include <
linux/init.h
>
25
#include <
asm/intel_scu_ipc.h
>
26
27
static
int
major
;
28
29
/* ioctl commnds */
30
#define INTE_SCU_IPC_REGISTER_READ 0
31
#define INTE_SCU_IPC_REGISTER_WRITE 1
32
#define INTE_SCU_IPC_REGISTER_UPDATE 2
33
34
struct
scu_ipc_data
{
35
u32
count
;
/* No. of registers */
36
u16
addr
[5];
/* Register addresses */
37
u8
data
[5];
/* Register data */
38
u8
mask
;
/* Valid for read-modify-write */
39
};
40
50
static
int
scu_reg_access(
u32
cmd
,
struct
scu_ipc_data
*
data
)
51
{
52
int
count
= data->
count
;
53
54
if
(count == 0 || count == 3 || count > 4)
55
return
-
EINVAL
;
56
57
switch
(cmd) {
58
case
INTE_SCU_IPC_REGISTER_READ
:
59
return
intel_scu_ipc_readv
(data->
addr
, data->
data
, count);
60
case
INTE_SCU_IPC_REGISTER_WRITE
:
61
return
intel_scu_ipc_writev
(data->
addr
, data->
data
, count);
62
case
INTE_SCU_IPC_REGISTER_UPDATE
:
63
return
intel_scu_ipc_update_register
(data->
addr
[0],
64
data->
data
[0], data->
mask
);
65
default
:
66
return
-
ENOTTY
;
67
}
68
}
69
78
static
long
scu_ipc_ioctl(
struct
file
*
fp
,
unsigned
int
cmd
,
79
unsigned
long
arg
)
80
{
81
int
ret
;
82
struct
scu_ipc_data
data
;
83
void
__user
*
argp
= (
void
__user
*)arg;
84
85
if
(!
capable
(
CAP_SYS_RAWIO
))
86
return
-
EPERM
;
87
88
if
(
copy_from_user
(&
data
, argp,
sizeof
(
struct
scu_ipc_data
)))
89
return
-
EFAULT
;
90
ret = scu_reg_access(cmd, &
data
);
91
if
(ret < 0)
92
return
ret
;
93
if
(
copy_to_user
(argp, &
data
,
sizeof
(
struct
scu_ipc_data
)))
94
return
-
EFAULT
;
95
return
0;
96
}
97
98
static
const
struct
file_operations
scu_ipc_fops = {
99
.unlocked_ioctl = scu_ipc_ioctl,
100
};
101
102
static
int
__init
ipc_module_init(
void
)
103
{
104
major
= register_chrdev(0,
"intel_mid_scu"
, &scu_ipc_fops);
105
if
(major < 0)
106
return
major
;
107
108
return
0;
109
}
110
111
static
void
__exit
ipc_module_exit(
void
)
112
{
113
unregister_chrdev(major,
"intel_mid_scu"
);
114
}
115
116
module_init
(ipc_module_init);
117
module_exit
(ipc_module_exit);
118
119
MODULE_LICENSE
(
"GPL v2"
);
120
MODULE_DESCRIPTION
(
"Utility driver for intel scu ipc"
);
121
MODULE_AUTHOR
(
"Sreedhara <
[email protected]
>"
);
Generated on Thu Jan 10 2013 14:15:31 for Linux Kernel by
1.8.2