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
88f60f62
Commit
88f60f62
authored
Jan 05, 2009
by
Ben Dooks
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'i2c-next-s3c' into i2c-next
parents
e355204e
e0d1ec97
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
78 additions
and
107 deletions
+78
-107
drivers/i2c/busses/i2c-s3c2410.c
drivers/i2c/busses/i2c-s3c2410.c
+78
-107
No files found.
drivers/i2c/busses/i2c-s3c2410.c
View file @
88f60f62
...
...
@@ -35,11 +35,9 @@
#include <linux/clk.h>
#include <linux/cpufreq.h>
#include <mach/hardware.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <mach/regs-gpio.h>
#include <asm/plat-s3c/regs-iic.h>
#include <asm/plat-s3c/iic.h>
...
...
@@ -63,6 +61,7 @@ struct s3c24xx_i2c {
unsigned
int
msg_ptr
;
unsigned
int
tx_setup
;
unsigned
int
irq
;
enum
s3c24xx_i2c_state
state
;
unsigned
long
clkrate
;
...
...
@@ -70,7 +69,6 @@ struct s3c24xx_i2c {
void
__iomem
*
regs
;
struct
clk
*
clk
;
struct
device
*
dev
;
struct
resource
*
irq
;
struct
resource
*
ioarea
;
struct
i2c_adapter
adap
;
...
...
@@ -79,16 +77,7 @@ struct s3c24xx_i2c {
#endif
};
/* default platform data to use if not supplied in the platform_device
*/
static
struct
s3c2410_platform_i2c
s3c24xx_i2c_default_platform
=
{
.
flags
=
0
,
.
slave_addr
=
0x10
,
.
bus_freq
=
100
*
1000
,
.
max_freq
=
400
*
1000
,
.
sda_delay
=
S3C2410_IICLC_SDA_DELAY5
|
S3C2410_IICLC_FILTER_ON
,
};
/* default platform data removed, dev should always carry data. */
/* s3c24xx_i2c_is2440()
*
...
...
@@ -102,21 +91,6 @@ static inline int s3c24xx_i2c_is2440(struct s3c24xx_i2c *i2c)
return
!
strcmp
(
pdev
->
name
,
"s3c2440-i2c"
);
}
/* s3c24xx_i2c_get_platformdata
*
* get the platform data associated with the given device, or return
* the default if there is none
*/
static
inline
struct
s3c2410_platform_i2c
*
s3c24xx_i2c_get_platformdata
(
struct
device
*
dev
)
{
if
(
dev
->
platform_data
!=
NULL
)
return
(
struct
s3c2410_platform_i2c
*
)
dev
->
platform_data
;
return
&
s3c24xx_i2c_default_platform
;
}
/* s3c24xx_i2c_master_complete
*
* complete the message and wake up the caller, using the given return code,
...
...
@@ -129,7 +103,7 @@ static inline void s3c24xx_i2c_master_complete(struct s3c24xx_i2c *i2c, int ret)
i2c
->
msg_ptr
=
0
;
i2c
->
msg
=
NULL
;
i2c
->
msg_idx
++
;
i2c
->
msg_idx
++
;
i2c
->
msg_num
=
0
;
if
(
ret
)
i2c
->
msg_idx
=
ret
;
...
...
@@ -143,7 +117,6 @@ static inline void s3c24xx_i2c_disable_ack(struct s3c24xx_i2c *i2c)
tmp
=
readl
(
i2c
->
regs
+
S3C2410_IICCON
);
writel
(
tmp
&
~
S3C2410_IICCON_ACKEN
,
i2c
->
regs
+
S3C2410_IICCON
);
}
static
inline
void
s3c24xx_i2c_enable_ack
(
struct
s3c24xx_i2c
*
i2c
)
...
...
@@ -152,7 +125,6 @@ static inline void s3c24xx_i2c_enable_ack(struct s3c24xx_i2c *i2c)
tmp
=
readl
(
i2c
->
regs
+
S3C2410_IICCON
);
writel
(
tmp
|
S3C2410_IICCON_ACKEN
,
i2c
->
regs
+
S3C2410_IICCON
);
}
/* irq enable/disable functions */
...
...
@@ -198,7 +170,7 @@ static void s3c24xx_i2c_message_start(struct s3c24xx_i2c *i2c,
if
(
msg
->
flags
&
I2C_M_REV_DIR_ADDR
)
addr
^=
1
;
/
/ todo - check for wether ack wanted or not
/
* todo - check for wether ack wanted or not */
s3c24xx_i2c_enable_ack
(
i2c
);
iiccon
=
readl
(
i2c
->
regs
+
S3C2410_IICCON
);
...
...
@@ -226,7 +198,7 @@ static inline void s3c24xx_i2c_stop(struct s3c24xx_i2c *i2c, int ret)
dev_dbg
(
i2c
->
dev
,
"STOP
\n
"
);
/* stop the transfer */
iicstat
&=
~
S3C2410_IICSTAT_START
;
iicstat
&=
~
S3C2410_IICSTAT_START
;
writel
(
iicstat
,
i2c
->
regs
+
S3C2410_IICSTAT
);
i2c
->
state
=
STATE_STOP
;
...
...
@@ -358,7 +330,7 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
dev_dbg
(
i2c
->
dev
,
"WRITE: Next Message
\n
"
);
i2c
->
msg_ptr
=
0
;
i2c
->
msg_idx
++
;
i2c
->
msg_idx
++
;
i2c
->
msg
++
;
/* check to see if we need to do another message */
...
...
@@ -374,7 +346,6 @@ static int i2s_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
goto
retry_write
;
}
else
{
/* send the new start */
s3c24xx_i2c_message_start
(
i2c
,
i2c
->
msg
);
i2c
->
state
=
STATE_START
;
...
...
@@ -449,7 +420,7 @@ static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id)
status
=
readl
(
i2c
->
regs
+
S3C2410_IICSTAT
);
if
(
status
&
S3C2410_IICSTAT_ARBITR
)
{
/
/ deal with arbitration loss
/
* deal with arbitration loss */
dev_err
(
i2c
->
dev
,
"deal with arbitration loss
\n
"
);
}
...
...
@@ -491,9 +462,6 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c)
msleep
(
1
);
}
dev_dbg
(
i2c
->
dev
,
"timeout: GPEDAT is %08x
\n
"
,
__raw_readl
(
S3C2410_GPEDAT
));
return
-
ETIMEDOUT
;
}
...
...
@@ -502,7 +470,8 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c)
* this starts an i2c transfer
*/
static
int
s3c24xx_i2c_doxfer
(
struct
s3c24xx_i2c
*
i2c
,
struct
i2c_msg
*
msgs
,
int
num
)
static
int
s3c24xx_i2c_doxfer
(
struct
s3c24xx_i2c
*
i2c
,
struct
i2c_msg
*
msgs
,
int
num
)
{
unsigned
long
timeout
;
int
ret
;
...
...
@@ -590,19 +559,6 @@ static const struct i2c_algorithm s3c24xx_i2c_algorithm = {
.
functionality
=
s3c24xx_i2c_func
,
};
static
struct
s3c24xx_i2c
s3c24xx_i2c
=
{
.
lock
=
__SPIN_LOCK_UNLOCKED
(
s3c24xx_i2c
.
lock
),
.
wait
=
__WAIT_QUEUE_HEAD_INITIALIZER
(
s3c24xx_i2c
.
wait
),
.
tx_setup
=
50
,
.
adap
=
{
.
name
=
"s3c2410-i2c"
,
.
owner
=
THIS_MODULE
,
.
algo
=
&
s3c24xx_i2c_algorithm
,
.
retries
=
2
,
.
class
=
I2C_CLASS_HWMON
|
I2C_CLASS_SPD
,
},
};
/* s3c24xx_i2c_calcdivisor
*
* return the divisor settings for a given frequency
...
...
@@ -642,7 +598,7 @@ static inline int freq_acceptable(unsigned int freq, unsigned int wanted)
{
int
diff
=
freq
-
wanted
;
return
(
diff
>=
-
2
&&
diff
<=
2
)
;
return
diff
>=
-
2
&&
diff
<=
2
;
}
/* s3c24xx_i2c_clockrate
...
...
@@ -654,7 +610,7 @@ static inline int freq_acceptable(unsigned int freq, unsigned int wanted)
static
int
s3c24xx_i2c_clockrate
(
struct
s3c24xx_i2c
*
i2c
,
unsigned
int
*
got
)
{
struct
s3c2410_platform_i2c
*
pdata
;
struct
s3c2410_platform_i2c
*
pdata
=
i2c
->
dev
->
platform_data
;
unsigned
long
clkin
=
clk_get_rate
(
i2c
->
clk
);
unsigned
int
divs
,
div1
;
u32
iiccon
;
...
...
@@ -662,8 +618,6 @@ static int s3c24xx_i2c_clockrate(struct s3c24xx_i2c *i2c, unsigned int *got)
int
start
,
end
;
i2c
->
clkrate
=
clkin
;
pdata
=
s3c24xx_i2c_get_platformdata
(
i2c
->
adap
.
dev
.
parent
);
clkin
/=
1000
;
/* clkin now in KHz */
dev_dbg
(
i2c
->
dev
,
"pdata %p, freq %lu %lu..%lu
\n
"
,
...
...
@@ -784,12 +738,12 @@ static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c)
/* get the plafrom data */
pdata
=
s3c24xx_i2c_get_platformdata
(
i2c
->
adap
.
dev
.
parent
)
;
pdata
=
i2c
->
dev
->
platform_data
;
/* inititalise the gpio */
s3c2410_gpio_cfgpin
(
S3C2410_GPE15
,
S3C2410_GPE15_IICSDA
);
s3c2410_gpio_cfgpin
(
S3C2410_GPE14
,
S3C2410_GPE14_IICSCL
);
if
(
pdata
->
cfg_gpio
)
pdata
->
cfg_gpio
(
to_platform_device
(
i2c
->
dev
)
);
/* write slave address */
...
...
@@ -830,12 +784,32 @@ static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c)
static
int
s3c24xx_i2c_probe
(
struct
platform_device
*
pdev
)
{
struct
s3c24xx_i2c
*
i2c
=
&
s3c24xx_i2c
;
struct
s3c24xx_i2c
*
i2c
;
struct
s3c2410_platform_i2c
*
pdata
;
struct
resource
*
res
;
int
ret
;
pdata
=
s3c24xx_i2c_get_platformdata
(
&
pdev
->
dev
);
pdata
=
pdev
->
dev
.
platform_data
;
if
(
!
pdata
)
{
dev_err
(
&
pdev
->
dev
,
"no platform data
\n
"
);
return
-
EINVAL
;
}
i2c
=
kzalloc
(
sizeof
(
struct
s3c24xx_i2c
),
GFP_KERNEL
);
if
(
!
i2c
)
{
dev_err
(
&
pdev
->
dev
,
"no memory for state
\n
"
);
return
-
ENOMEM
;
}
strlcpy
(
i2c
->
adap
.
name
,
"s3c2410-i2c"
,
sizeof
(
i2c
->
adap
.
name
));
i2c
->
adap
.
owner
=
THIS_MODULE
;
i2c
->
adap
.
algo
=
&
s3c24xx_i2c_algorithm
;
i2c
->
adap
.
retries
=
2
;
i2c
->
adap
.
class
=
I2C_CLASS_HWMON
|
I2C_CLASS_SPD
;
i2c
->
tx_setup
=
50
;
spin_lock_init
(
&
i2c
->
lock
);
init_waitqueue_head
(
&
i2c
->
wait
);
/* find the clock and enable it */
...
...
@@ -877,7 +851,8 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
goto
err_ioarea
;
}
dev_dbg
(
&
pdev
->
dev
,
"registers %p (%p, %p)
\n
"
,
i2c
->
regs
,
i2c
->
ioarea
,
res
);
dev_dbg
(
&
pdev
->
dev
,
"registers %p (%p, %p)
\n
"
,
i2c
->
regs
,
i2c
->
ioarea
,
res
);
/* setup info block for the i2c core */
...
...
@@ -894,26 +869,20 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
* ensure no current IRQs pending
*/
res
=
platform_get_resource
(
pdev
,
IORESOURCE_IRQ
,
0
);
if
(
re
s
==
NULL
)
{
i2c
->
irq
=
ret
=
platform_get_irq
(
pdev
,
0
);
if
(
re
t
<=
0
)
{
dev_err
(
&
pdev
->
dev
,
"cannot find IRQ
\n
"
);
ret
=
-
ENOENT
;
goto
err_iomap
;
}
ret
=
request_irq
(
res
->
start
,
s3c24xx_i2c_irq
,
IRQF_DISABLED
,
pdev
->
name
,
i2c
);
ret
=
request_irq
(
i2c
->
irq
,
s3c24xx_i2c_irq
,
IRQF_DISABLED
,
dev_name
(
&
pdev
->
dev
)
,
i2c
);
if
(
ret
!=
0
)
{
dev_err
(
&
pdev
->
dev
,
"cannot claim IRQ
\n
"
);
dev_err
(
&
pdev
->
dev
,
"cannot claim IRQ
%d
\n
"
,
i2c
->
irq
);
goto
err_iomap
;
}
i2c
->
irq
=
res
;
dev_dbg
(
&
pdev
->
dev
,
"irq resource %p (%lu)
\n
"
,
res
,
(
unsigned
long
)
res
->
start
);
ret
=
s3c24xx_i2c_register_cpufreq
(
i2c
);
if
(
ret
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"failed to register cpufreq notifier
\n
"
);
...
...
@@ -943,7 +912,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
s3c24xx_i2c_deregister_cpufreq
(
i2c
);
err_irq:
free_irq
(
i2c
->
irq
->
start
,
i2c
);
free_irq
(
i2c
->
irq
,
i2c
);
err_iomap:
iounmap
(
i2c
->
regs
);
...
...
@@ -957,6 +926,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)
clk_put
(
i2c
->
clk
);
err_noclk:
kfree
(
i2c
);
return
ret
;
}
...
...
@@ -972,7 +942,7 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev)
s3c24xx_i2c_deregister_cpufreq
(
i2c
);
i2c_del_adapter
(
&
i2c
->
adap
);
free_irq
(
i2c
->
irq
->
start
,
i2c
);
free_irq
(
i2c
->
irq
,
i2c
);
clk_disable
(
i2c
->
clk
);
clk_put
(
i2c
->
clk
);
...
...
@@ -981,6 +951,7 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev)
release_resource
(
i2c
->
ioarea
);
kfree
(
i2c
->
ioarea
);
kfree
(
i2c
);
return
0
;
}
...
...
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