@@ -83,6 +83,7 @@ MODULE_PARM_DESC(polling_limit_us,
83
83
* struct bcm2835_spi - BCM2835 SPI controller
84
84
* @regs: base address of register map
85
85
* @clk: core clock, divided to calculate serial clock
86
+ * @clk_hz: core clock cached speed
86
87
* @irq: interrupt, signals TX FIFO empty or RX FIFO ¾ full
87
88
* @tfr: SPI transfer currently processed
88
89
* @ctlr: SPI controller reverse lookup
@@ -116,6 +117,7 @@ MODULE_PARM_DESC(polling_limit_us,
116
117
struct bcm2835_spi {
117
118
void __iomem * regs ;
118
119
struct clk * clk ;
120
+ unsigned long clk_hz ;
119
121
int irq ;
120
122
struct spi_transfer * tfr ;
121
123
struct spi_controller * ctlr ;
@@ -1045,27 +1047,26 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr,
1045
1047
{
1046
1048
struct bcm2835_spi * bs = spi_controller_get_devdata (ctlr );
1047
1049
struct bcm2835_spidev * slv = spi_get_ctldata (spi );
1048
- unsigned long spi_hz , clk_hz , cdiv ;
1050
+ unsigned long spi_hz , cdiv ;
1049
1051
unsigned long hz_per_byte , byte_limit ;
1050
1052
u32 cs = slv -> prepare_cs ;
1051
1053
1052
1054
/* set clock */
1053
1055
spi_hz = tfr -> speed_hz ;
1054
- clk_hz = clk_get_rate (bs -> clk );
1055
1056
1056
- if (spi_hz >= clk_hz / 2 ) {
1057
+ if (spi_hz >= bs -> clk_hz / 2 ) {
1057
1058
cdiv = 2 ; /* clk_hz/2 is the fastest we can go */
1058
1059
} else if (spi_hz ) {
1059
1060
/* CDIV must be a multiple of two */
1060
- cdiv = DIV_ROUND_UP (clk_hz , spi_hz );
1061
+ cdiv = DIV_ROUND_UP (bs -> clk_hz , spi_hz );
1061
1062
cdiv += (cdiv % 2 );
1062
1063
1063
1064
if (cdiv >= 65536 )
1064
1065
cdiv = 0 ; /* 0 is the slowest we can go */
1065
1066
} else {
1066
1067
cdiv = 0 ; /* 0 is the slowest we can go */
1067
1068
}
1068
- tfr -> effective_speed_hz = cdiv ? (clk_hz / cdiv ) : (clk_hz / 65536 );
1069
+ tfr -> effective_speed_hz = cdiv ? (bs -> clk_hz / cdiv ) : (bs -> clk_hz / 65536 );
1069
1070
bcm2835_wr (bs , BCM2835_SPI_CLK , cdiv );
1070
1071
1071
1072
/* handle all the 3-wire mode */
@@ -1354,6 +1355,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev)
1354
1355
return bs -> irq ? bs -> irq : - ENODEV ;
1355
1356
1356
1357
clk_prepare_enable (bs -> clk );
1358
+ bs -> clk_hz = clk_get_rate (bs -> clk );
1357
1359
1358
1360
err = bcm2835_dma_init (ctlr , & pdev -> dev , bs );
1359
1361
if (err )
0 commit comments