Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
439a8888
Commit
439a8888
authored
Mar 22, 2007
by
Len Brown
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ACPI: sbs: remove i2c_ec.[ch]
Signed-off-by:
Len Brown
<
len.brown@intel.com
>
parent
72206233
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
0 additions
and
426 deletions
+0
-426
drivers/acpi/i2c_ec.c
drivers/acpi/i2c_ec.c
+0
-403
drivers/acpi/i2c_ec.h
drivers/acpi/i2c_ec.h
+0
-23
No files found.
drivers/acpi/i2c_ec.c
deleted
100644 → 0
View file @
72206233
/*
* SMBus driver for ACPI Embedded Controller ($Revision: 1.3 $)
*
* Copyright (c) 2002, 2005 Ducrot Bruno
* Copyright (c) 2005 Rich Townsend (tiny hacks & tweaks)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2.
*/
#include <linux/version.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/stddef.h>
#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/acpi.h>
#include <linux/delay.h>
#include "i2c_ec.h"
#define xudelay(t) udelay(t)
#define xmsleep(t) msleep(t)
#define ACPI_EC_HC_COMPONENT 0x00080000
#define ACPI_EC_HC_CLASS "ec_hc_smbus"
#define ACPI_EC_HC_HID "ACPI0001"
#define ACPI_EC_HC_DEVICE_NAME "EC HC smbus"
#define _COMPONENT ACPI_EC_HC_COMPONENT
ACPI_MODULE_NAME
(
"i2c_ec"
);
static
int
acpi_ec_hc_add
(
struct
acpi_device
*
device
);
static
int
acpi_ec_hc_remove
(
struct
acpi_device
*
device
,
int
type
);
static
struct
acpi_driver
acpi_ec_hc_driver
=
{
.
name
=
"i2c_ec"
,
.
class
=
ACPI_EC_HC_CLASS
,
.
ids
=
ACPI_EC_HC_HID
,
.
ops
=
{
.
add
=
acpi_ec_hc_add
,
.
remove
=
acpi_ec_hc_remove
,
},
};
/* Various bit mask for EC_SC (R) */
#define OBF 0x01
#define IBF 0x02
#define CMD 0x08
#define BURST 0x10
#define SCI_EVT 0x20
#define SMI_EVT 0x40
/* Commands for EC_SC (W) */
#define RD_EC 0x80
#define WR_EC 0x81
#define BE_EC 0x82
#define BD_EC 0x83
#define QR_EC 0x84
/*
* ACPI 2.0 chapter 13 SMBus 2.0 EC register model
*/
#define ACPI_EC_SMB_PRTCL 0x00
/* protocol, PEC */
#define ACPI_EC_SMB_STS 0x01
/* status */
#define ACPI_EC_SMB_ADDR 0x02
/* address */
#define ACPI_EC_SMB_CMD 0x03
/* command */
#define ACPI_EC_SMB_DATA 0x04
/* 32 data registers */
#define ACPI_EC_SMB_BCNT 0x24
/* number of data bytes */
#define ACPI_EC_SMB_ALRM_A 0x25
/* alarm address */
#define ACPI_EC_SMB_ALRM_D 0x26
/* 2 bytes alarm data */
#define ACPI_EC_SMB_STS_DONE 0x80
#define ACPI_EC_SMB_STS_ALRM 0x40
#define ACPI_EC_SMB_STS_RES 0x20
#define ACPI_EC_SMB_STS_STATUS 0x1f
#define ACPI_EC_SMB_STATUS_OK 0x00
#define ACPI_EC_SMB_STATUS_FAIL 0x07
#define ACPI_EC_SMB_STATUS_DNAK 0x10
#define ACPI_EC_SMB_STATUS_DERR 0x11
#define ACPI_EC_SMB_STATUS_CMD_DENY 0x12
#define ACPI_EC_SMB_STATUS_UNKNOWN 0x13
#define ACPI_EC_SMB_STATUS_ACC_DENY 0x17
#define ACPI_EC_SMB_STATUS_TIMEOUT 0x18
#define ACPI_EC_SMB_STATUS_NOTSUP 0x19
#define ACPI_EC_SMB_STATUS_BUSY 0x1A
#define ACPI_EC_SMB_STATUS_PEC 0x1F
#define ACPI_EC_SMB_PRTCL_WRITE 0x00
#define ACPI_EC_SMB_PRTCL_READ 0x01
#define ACPI_EC_SMB_PRTCL_QUICK 0x02
#define ACPI_EC_SMB_PRTCL_BYTE 0x04
#define ACPI_EC_SMB_PRTCL_BYTE_DATA 0x06
#define ACPI_EC_SMB_PRTCL_WORD_DATA 0x08
#define ACPI_EC_SMB_PRTCL_BLOCK_DATA 0x0a
#define ACPI_EC_SMB_PRTCL_PROC_CALL 0x0c
#define ACPI_EC_SMB_PRTCL_BLOCK_PROC_CALL 0x0d
#define ACPI_EC_SMB_PRTCL_I2C_BLOCK_DATA 0x4a
#define ACPI_EC_SMB_PRTCL_PEC 0x80
/* Length of pre/post transaction sleep (msec) */
#define ACPI_EC_SMB_TRANSACTION_SLEEP 1
#define ACPI_EC_SMB_ACCESS_SLEEP1 1
#define ACPI_EC_SMB_ACCESS_SLEEP2 10
static
int
acpi_ec_smb_read
(
struct
acpi_ec_smbus
*
smbus
,
u8
address
,
u8
*
data
)
{
u8
val
;
int
err
;
err
=
ec_read
(
smbus
->
base
+
address
,
&
val
);
if
(
!
err
)
{
*
data
=
val
;
}
xmsleep
(
ACPI_EC_SMB_TRANSACTION_SLEEP
);
return
(
err
);
}
static
int
acpi_ec_smb_write
(
struct
acpi_ec_smbus
*
smbus
,
u8
address
,
u8
data
)
{
int
err
;
err
=
ec_write
(
smbus
->
base
+
address
,
data
);
return
(
err
);
}
static
int
acpi_ec_smb_access
(
struct
i2c_adapter
*
adap
,
u16
addr
,
unsigned
short
flags
,
char
read_write
,
u8
command
,
int
size
,
union
i2c_smbus_data
*
data
)
{
struct
acpi_ec_smbus
*
smbus
=
adap
->
algo_data
;
unsigned
char
protocol
,
len
=
0
,
pec
,
temp
[
2
]
=
{
0
,
0
};
int
i
;
if
(
read_write
==
I2C_SMBUS_READ
)
{
protocol
=
ACPI_EC_SMB_PRTCL_READ
;
}
else
{
protocol
=
ACPI_EC_SMB_PRTCL_WRITE
;
}
pec
=
(
flags
&
I2C_CLIENT_PEC
)
?
ACPI_EC_SMB_PRTCL_PEC
:
0
;
switch
(
size
)
{
case
I2C_SMBUS_QUICK
:
protocol
|=
ACPI_EC_SMB_PRTCL_QUICK
;
read_write
=
I2C_SMBUS_WRITE
;
break
;
case
I2C_SMBUS_BYTE
:
if
(
read_write
==
I2C_SMBUS_WRITE
)
{
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_DATA
,
data
->
byte
);
}
protocol
|=
ACPI_EC_SMB_PRTCL_BYTE
;
break
;
case
I2C_SMBUS_BYTE_DATA
:
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_CMD
,
command
);
if
(
read_write
==
I2C_SMBUS_WRITE
)
{
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_DATA
,
data
->
byte
);
}
protocol
|=
ACPI_EC_SMB_PRTCL_BYTE_DATA
;
break
;
case
I2C_SMBUS_WORD_DATA
:
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_CMD
,
command
);
if
(
read_write
==
I2C_SMBUS_WRITE
)
{
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_DATA
,
data
->
word
);
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_DATA
+
1
,
data
->
word
>>
8
);
}
protocol
|=
ACPI_EC_SMB_PRTCL_WORD_DATA
|
pec
;
break
;
case
I2C_SMBUS_BLOCK_DATA
:
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_CMD
,
command
);
if
(
read_write
==
I2C_SMBUS_WRITE
)
{
len
=
min_t
(
u8
,
data
->
block
[
0
],
32
);
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_BCNT
,
len
);
for
(
i
=
0
;
i
<
len
;
i
++
)
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_DATA
+
i
,
data
->
block
[
i
+
1
]);
}
protocol
|=
ACPI_EC_SMB_PRTCL_BLOCK_DATA
|
pec
;
break
;
case
I2C_SMBUS_I2C_BLOCK_DATA
:
len
=
min_t
(
u8
,
data
->
block
[
0
],
32
);
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_CMD
,
command
);
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_BCNT
,
len
);
if
(
read_write
==
I2C_SMBUS_WRITE
)
{
for
(
i
=
0
;
i
<
len
;
i
++
)
{
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_DATA
+
i
,
data
->
block
[
i
+
1
]);
}
}
protocol
|=
ACPI_EC_SMB_PRTCL_I2C_BLOCK_DATA
;
break
;
case
I2C_SMBUS_PROC_CALL
:
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_CMD
,
command
);
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_DATA
,
data
->
word
);
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_DATA
+
1
,
data
->
word
>>
8
);
protocol
=
ACPI_EC_SMB_PRTCL_PROC_CALL
|
pec
;
read_write
=
I2C_SMBUS_READ
;
break
;
case
I2C_SMBUS_BLOCK_PROC_CALL
:
protocol
|=
pec
;
len
=
min_t
(
u8
,
data
->
block
[
0
],
31
);
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_CMD
,
command
);
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_BCNT
,
len
);
for
(
i
=
0
;
i
<
len
;
i
++
)
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_DATA
+
i
,
data
->
block
[
i
+
1
]);
protocol
=
ACPI_EC_SMB_PRTCL_BLOCK_PROC_CALL
|
pec
;
read_write
=
I2C_SMBUS_READ
;
break
;
default:
ACPI_DEBUG_PRINT
((
ACPI_DB_WARN
,
"EC SMBus adapter: "
"Unsupported transaction %d
\n
"
,
size
));
return
(
-
1
);
}
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_ADDR
,
addr
<<
1
);
acpi_ec_smb_write
(
smbus
,
ACPI_EC_SMB_PRTCL
,
protocol
);
acpi_ec_smb_read
(
smbus
,
ACPI_EC_SMB_STS
,
temp
+
0
);
if
(
~
temp
[
0
]
&
ACPI_EC_SMB_STS_DONE
)
{
xudelay
(
500
);
acpi_ec_smb_read
(
smbus
,
ACPI_EC_SMB_STS
,
temp
+
0
);
}
if
(
~
temp
[
0
]
&
ACPI_EC_SMB_STS_DONE
)
{
xmsleep
(
ACPI_EC_SMB_ACCESS_SLEEP2
);
acpi_ec_smb_read
(
smbus
,
ACPI_EC_SMB_STS
,
temp
+
0
);
}
if
((
~
temp
[
0
]
&
ACPI_EC_SMB_STS_DONE
)
||
(
temp
[
0
]
&
ACPI_EC_SMB_STS_STATUS
))
{
return
(
-
1
);
}
if
(
read_write
==
I2C_SMBUS_WRITE
)
{
return
(
0
);
}
switch
(
size
)
{
case
I2C_SMBUS_BYTE
:
case
I2C_SMBUS_BYTE_DATA
:
acpi_ec_smb_read
(
smbus
,
ACPI_EC_SMB_DATA
,
&
data
->
byte
);
break
;
case
I2C_SMBUS_WORD_DATA
:
case
I2C_SMBUS_PROC_CALL
:
acpi_ec_smb_read
(
smbus
,
ACPI_EC_SMB_DATA
,
temp
+
0
);
acpi_ec_smb_read
(
smbus
,
ACPI_EC_SMB_DATA
+
1
,
temp
+
1
);
data
->
word
=
(
temp
[
1
]
<<
8
)
|
temp
[
0
];
break
;
case
I2C_SMBUS_BLOCK_DATA
:
case
I2C_SMBUS_BLOCK_PROC_CALL
:
len
=
0
;
acpi_ec_smb_read
(
smbus
,
ACPI_EC_SMB_BCNT
,
&
len
);
len
=
min_t
(
u8
,
len
,
32
);
case
I2C_SMBUS_I2C_BLOCK_DATA
:
for
(
i
=
0
;
i
<
len
;
i
++
)
acpi_ec_smb_read
(
smbus
,
ACPI_EC_SMB_DATA
+
i
,
data
->
block
+
i
+
1
);
data
->
block
[
0
]
=
len
;
break
;
}
return
(
0
);
}
static
u32
acpi_ec_smb_func
(
struct
i2c_adapter
*
adapter
)
{
return
(
I2C_FUNC_SMBUS_QUICK
|
I2C_FUNC_SMBUS_BYTE
|
I2C_FUNC_SMBUS_BYTE_DATA
|
I2C_FUNC_SMBUS_WORD_DATA
|
I2C_FUNC_SMBUS_BLOCK_DATA
|
I2C_FUNC_SMBUS_PROC_CALL
|
I2C_FUNC_SMBUS_BLOCK_PROC_CALL
|
I2C_FUNC_SMBUS_I2C_BLOCK
|
I2C_FUNC_SMBUS_HWPEC_CALC
);
}
static
const
struct
i2c_algorithm
acpi_ec_smbus_algorithm
=
{
.
smbus_xfer
=
acpi_ec_smb_access
,
.
functionality
=
acpi_ec_smb_func
,
};
static
int
acpi_ec_hc_add
(
struct
acpi_device
*
device
)
{
int
status
;
unsigned
long
val
;
struct
acpi_ec_hc
*
ec_hc
;
struct
acpi_ec_smbus
*
smbus
;
if
(
!
device
)
{
return
-
EINVAL
;
}
ec_hc
=
kzalloc
(
sizeof
(
struct
acpi_ec_hc
),
GFP_KERNEL
);
if
(
!
ec_hc
)
{
return
-
ENOMEM
;
}
smbus
=
kzalloc
(
sizeof
(
struct
acpi_ec_smbus
),
GFP_KERNEL
);
if
(
!
smbus
)
{
kfree
(
ec_hc
);
return
-
ENOMEM
;
}
ec_hc
->
handle
=
device
->
handle
;
strcpy
(
acpi_device_name
(
device
),
ACPI_EC_HC_DEVICE_NAME
);
strcpy
(
acpi_device_class
(
device
),
ACPI_EC_HC_CLASS
);
acpi_driver_data
(
device
)
=
ec_hc
;
status
=
acpi_evaluate_integer
(
ec_hc
->
handle
,
"_EC"
,
NULL
,
&
val
);
if
(
ACPI_FAILURE
(
status
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_WARN
,
"Error obtaining _EC
\n
"
));
kfree
(
ec_hc
);
kfree
(
smbus
);
return
-
EIO
;
}
smbus
->
ec
=
acpi_driver_data
(
device
->
parent
);
smbus
->
base
=
(
val
&
0xff00ull
)
>>
8
;
smbus
->
alert
=
val
&
0xffull
;
smbus
->
adapter
.
owner
=
THIS_MODULE
;
smbus
->
adapter
.
algo
=
&
acpi_ec_smbus_algorithm
;
smbus
->
adapter
.
algo_data
=
smbus
;
smbus
->
adapter
.
dev
.
parent
=
&
device
->
dev
;
if
(
i2c_add_adapter
(
&
smbus
->
adapter
))
{
ACPI_DEBUG_PRINT
((
ACPI_DB_WARN
,
"EC SMBus adapter: Failed to register adapter
\n
"
));
kfree
(
smbus
);
kfree
(
ec_hc
);
return
-
EIO
;
}
ec_hc
->
smbus
=
smbus
;
printk
(
KERN_INFO
PREFIX
"%s [%s]
\n
"
,
acpi_device_name
(
device
),
acpi_device_bid
(
device
));
return
AE_OK
;
}
static
int
acpi_ec_hc_remove
(
struct
acpi_device
*
device
,
int
type
)
{
struct
acpi_ec_hc
*
ec_hc
;
if
(
!
device
)
{
return
-
EINVAL
;
}
ec_hc
=
acpi_driver_data
(
device
);
i2c_del_adapter
(
&
ec_hc
->
smbus
->
adapter
);
kfree
(
ec_hc
->
smbus
);
kfree
(
ec_hc
);
return
AE_OK
;
}
static
int
__init
acpi_ec_hc_init
(
void
)
{
int
result
;
result
=
acpi_bus_register_driver
(
&
acpi_ec_hc_driver
);
if
(
result
<
0
)
{
return
-
ENODEV
;
}
return
0
;
}
static
void
__exit
acpi_ec_hc_exit
(
void
)
{
acpi_bus_unregister_driver
(
&
acpi_ec_hc_driver
);
}
struct
acpi_ec_hc
*
acpi_get_ec_hc
(
struct
acpi_device
*
device
)
{
return
acpi_driver_data
(
device
->
parent
);
}
EXPORT_SYMBOL
(
acpi_get_ec_hc
);
module_init
(
acpi_ec_hc_init
);
module_exit
(
acpi_ec_hc_exit
);
MODULE_LICENSE
(
"GPL"
);
MODULE_AUTHOR
(
"Ducrot Bruno"
);
MODULE_DESCRIPTION
(
"ACPI EC SMBus driver"
);
drivers/acpi/i2c_ec.h
deleted
100644 → 0
View file @
72206233
/*
* SMBus driver for ACPI Embedded Controller ($Revision: 1.2 $)
*
* Copyright (c) 2002, 2005 Ducrot Bruno
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2.
*/
struct
acpi_ec_smbus
{
struct
i2c_adapter
adapter
;
union
acpi_ec
*
ec
;
int
base
;
int
alert
;
};
struct
acpi_ec_hc
{
acpi_handle
handle
;
struct
acpi_ec_smbus
*
smbus
;
};
struct
acpi_ec_hc
*
acpi_get_ec_hc
(
struct
acpi_device
*
device
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment