Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
84c86eda
Commit
84c86eda
authored
Sep 01, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'spi/topic/mpc512x' into spi-next
parents
4faad26c
a81a5094
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
30 additions
and
18 deletions
+30
-18
drivers/spi/spi-mpc512x-psc.c
drivers/spi/spi-mpc512x-psc.c
+30
-18
No files found.
drivers/spi/spi-mpc512x-psc.c
View file @
84c86eda
...
...
@@ -38,7 +38,8 @@ struct mpc512x_psc_spi {
struct
mpc512x_psc_fifo
__iomem
*
fifo
;
unsigned
int
irq
;
u8
bits_per_word
;
u32
mclk
;
struct
clk
*
clk_mclk
;
u32
mclk_rate
;
struct
completion
txisrdone
;
};
...
...
@@ -72,6 +73,7 @@ static void mpc512x_psc_spi_activate_cs(struct spi_device *spi)
struct
mpc52xx_psc
__iomem
*
psc
=
mps
->
psc
;
u32
sicr
;
u32
ccr
;
int
speed
;
u16
bclkdiv
;
sicr
=
in_be32
(
&
psc
->
sicr
);
...
...
@@ -95,10 +97,10 @@ static void mpc512x_psc_spi_activate_cs(struct spi_device *spi)
ccr
=
in_be32
(
&
psc
->
ccr
);
ccr
&=
0xFF000000
;
if
(
cs
->
speed_hz
)
bclkdiv
=
(
mps
->
mclk
/
cs
->
speed_hz
)
-
1
;
else
bclkdiv
=
(
mps
->
mclk
/
1000000
)
-
1
;
/* default 1MHz */
speed
=
cs
->
speed_hz
;
if
(
!
speed
)
speed
=
1000000
;
/* default 1MHz */
bclkdiv
=
(
mps
->
mclk_rate
/
speed
)
-
1
;
ccr
|=
(((
bclkdiv
&
0xff
)
<<
16
)
|
(((
bclkdiv
>>
8
)
&
0xff
)
<<
8
));
out_be32
(
&
psc
->
ccr
,
ccr
);
...
...
@@ -386,19 +388,11 @@ static int mpc512x_psc_spi_port_config(struct spi_master *master,
{
struct
mpc52xx_psc
__iomem
*
psc
=
mps
->
psc
;
struct
mpc512x_psc_fifo
__iomem
*
fifo
=
mps
->
fifo
;
struct
clk
*
spiclk
;
int
ret
=
0
;
char
name
[
32
];
u32
sicr
;
u32
ccr
;
int
speed
;
u16
bclkdiv
;
sprintf
(
name
,
"psc%d_mclk"
,
master
->
bus_num
);
spiclk
=
clk_get
(
&
master
->
dev
,
name
);
clk_enable
(
spiclk
);
mps
->
mclk
=
clk_get_rate
(
spiclk
);
clk_put
(
spiclk
);
/* Reset the PSC into a known state */
out_8
(
&
psc
->
command
,
MPC52xx_PSC_RST_RX
);
out_8
(
&
psc
->
command
,
MPC52xx_PSC_RST_TX
);
...
...
@@ -425,7 +419,8 @@ static int mpc512x_psc_spi_port_config(struct spi_master *master,
ccr
=
in_be32
(
&
psc
->
ccr
);
ccr
&=
0xFF000000
;
bclkdiv
=
(
mps
->
mclk
/
1000000
)
-
1
;
/* default 1MHz */
speed
=
1000000
;
/* default 1MHz */
bclkdiv
=
(
mps
->
mclk_rate
/
speed
)
-
1
;
ccr
|=
(((
bclkdiv
&
0xff
)
<<
16
)
|
(((
bclkdiv
>>
8
)
&
0xff
)
<<
8
));
out_be32
(
&
psc
->
ccr
,
ccr
);
...
...
@@ -445,7 +440,7 @@ static int mpc512x_psc_spi_port_config(struct spi_master *master,
mps
->
bits_per_word
=
8
;
return
ret
;
return
0
;
}
static
irqreturn_t
mpc512x_psc_spi_isr
(
int
irq
,
void
*
dev_id
)
...
...
@@ -479,6 +474,9 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr,
struct
spi_master
*
master
;
int
ret
;
void
*
tempp
;
int
psc_num
;
char
clk_name
[
16
];
struct
clk
*
clk
;
master
=
spi_alloc_master
(
dev
,
sizeof
*
mps
);
if
(
master
==
NULL
)
...
...
@@ -521,16 +519,29 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr,
goto
free_master
;
init_completion
(
&
mps
->
txisrdone
);
psc_num
=
master
->
bus_num
;
snprintf
(
clk_name
,
sizeof
(
clk_name
),
"psc%d_mclk"
,
psc_num
);
clk
=
devm_clk_get
(
dev
,
clk_name
);
if
(
IS_ERR
(
clk
))
goto
free_irq
;
ret
=
clk_prepare_enable
(
clk
);
if
(
ret
)
goto
free_irq
;
mps
->
clk_mclk
=
clk
;
mps
->
mclk_rate
=
clk_get_rate
(
clk
);
ret
=
mpc512x_psc_spi_port_config
(
master
,
mps
);
if
(
ret
<
0
)
goto
free_
irq
;
goto
free_
clock
;
ret
=
spi_register_master
(
master
);
if
(
ret
<
0
)
goto
free_
irq
;
goto
free_
clock
;
return
ret
;
free_clock:
clk_disable_unprepare
(
mps
->
clk_mclk
);
free_irq:
free_irq
(
mps
->
irq
,
mps
);
free_master:
...
...
@@ -547,6 +558,7 @@ static int mpc512x_psc_spi_do_remove(struct device *dev)
struct
mpc512x_psc_spi
*
mps
=
spi_master_get_devdata
(
master
);
spi_unregister_master
(
master
);
clk_disable_unprepare
(
mps
->
clk_mclk
);
free_irq
(
mps
->
irq
,
mps
);
if
(
mps
->
psc
)
iounmap
(
mps
->
psc
);
...
...
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