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
8f737d61
Commit
8f737d61
authored
Oct 25, 2013
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'spi/topic/core' into spi-next
parents
d42b70f5
5fe5f05e
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
36 additions
and
41 deletions
+36
-41
drivers/spi/spi.c
drivers/spi/spi.c
+36
-41
No files found.
drivers/spi/spi.c
View file @
8f737d61
...
@@ -58,11 +58,13 @@ modalias_show(struct device *dev, struct device_attribute *a, char *buf)
...
@@ -58,11 +58,13 @@ modalias_show(struct device *dev, struct device_attribute *a, char *buf)
return
sprintf
(
buf
,
"%s%s
\n
"
,
SPI_MODULE_PREFIX
,
spi
->
modalias
);
return
sprintf
(
buf
,
"%s%s
\n
"
,
SPI_MODULE_PREFIX
,
spi
->
modalias
);
}
}
static
DEVICE_ATTR_RO
(
modalias
);
static
struct
device_attribute
spi_dev_attrs
[]
=
{
static
struct
attribute
*
spi_dev_attrs
[]
=
{
__ATTR_RO
(
modalias
)
,
&
dev_attr_modalias
.
attr
,
__ATTR_
NULL
,
NULL
,
};
};
ATTRIBUTE_GROUPS
(
spi_dev
);
/* modalias support makes "modprobe $MODALIAS" new-style hotplug work,
/* modalias support makes "modprobe $MODALIAS" new-style hotplug work,
* and the sysfs version makes coldplug work too.
* and the sysfs version makes coldplug work too.
...
@@ -229,7 +231,7 @@ static const struct dev_pm_ops spi_pm = {
...
@@ -229,7 +231,7 @@ static const struct dev_pm_ops spi_pm = {
struct
bus_type
spi_bus_type
=
{
struct
bus_type
spi_bus_type
=
{
.
name
=
"spi"
,
.
name
=
"spi"
,
.
dev_
attrs
=
spi_dev_attr
s
,
.
dev_
groups
=
spi_dev_group
s
,
.
match
=
spi_match_device
,
.
match
=
spi_match_device
,
.
uevent
=
spi_uevent
,
.
uevent
=
spi_uevent
,
.
pm
=
&
spi_pm
,
.
pm
=
&
spi_pm
,
...
@@ -323,7 +325,7 @@ struct spi_device *spi_alloc_device(struct spi_master *master)
...
@@ -323,7 +325,7 @@ struct spi_device *spi_alloc_device(struct spi_master *master)
if
(
!
spi_master_get
(
master
))
if
(
!
spi_master_get
(
master
))
return
NULL
;
return
NULL
;
spi
=
kzalloc
(
sizeof
*
spi
,
GFP_KERNEL
);
spi
=
kzalloc
(
sizeof
(
*
spi
)
,
GFP_KERNEL
);
if
(
!
spi
)
{
if
(
!
spi
)
{
dev_err
(
dev
,
"cannot alloc spi_device
\n
"
);
dev_err
(
dev
,
"cannot alloc spi_device
\n
"
);
spi_master_put
(
master
);
spi_master_put
(
master
);
...
@@ -838,10 +840,8 @@ static void of_register_spi_devices(struct spi_master *master)
...
@@ -838,10 +840,8 @@ static void of_register_spi_devices(struct spi_master *master)
{
{
struct
spi_device
*
spi
;
struct
spi_device
*
spi
;
struct
device_node
*
nc
;
struct
device_node
*
nc
;
const
__be32
*
prop
;
char
modalias
[
SPI_NAME_SIZE
+
4
];
int
rc
;
int
rc
;
int
len
;
u32
value
;
if
(
!
master
->
dev
.
of_node
)
if
(
!
master
->
dev
.
of_node
)
return
;
return
;
...
@@ -866,14 +866,14 @@ static void of_register_spi_devices(struct spi_master *master)
...
@@ -866,14 +866,14 @@ static void of_register_spi_devices(struct spi_master *master)
}
}
/* Device address */
/* Device address */
prop
=
of_get_property
(
nc
,
"reg"
,
&
len
);
rc
=
of_property_read_u32
(
nc
,
"reg"
,
&
value
);
if
(
!
prop
||
len
<
sizeof
(
*
prop
)
)
{
if
(
rc
)
{
dev_err
(
&
master
->
dev
,
"%s has no
'reg' property
\n
"
,
dev_err
(
&
master
->
dev
,
"%s has no
valid 'reg' property (%d)
\n
"
,
nc
->
full_name
);
nc
->
full_name
,
rc
);
spi_dev_put
(
spi
);
spi_dev_put
(
spi
);
continue
;
continue
;
}
}
spi
->
chip_select
=
be32_to_cpup
(
prop
)
;
spi
->
chip_select
=
value
;
/* Mode (clock phase/polarity/etc.) */
/* Mode (clock phase/polarity/etc.) */
if
(
of_find_property
(
nc
,
"spi-cpha"
,
NULL
))
if
(
of_find_property
(
nc
,
"spi-cpha"
,
NULL
))
...
@@ -886,55 +886,53 @@ static void of_register_spi_devices(struct spi_master *master)
...
@@ -886,55 +886,53 @@ static void of_register_spi_devices(struct spi_master *master)
spi
->
mode
|=
SPI_3WIRE
;
spi
->
mode
|=
SPI_3WIRE
;
/* Device DUAL/QUAD mode */
/* Device DUAL/QUAD mode */
prop
=
of_get_property
(
nc
,
"spi-tx-bus-width"
,
&
len
);
if
(
!
of_property_read_u32
(
nc
,
"spi-tx-bus-width"
,
&
value
))
{
if
(
prop
&&
len
==
sizeof
(
*
prop
))
{
switch
(
value
)
{
switch
(
be32_to_cpup
(
prop
))
{
case
1
:
case
SPI_NBITS_SINGLE
:
break
;
break
;
case
SPI_NBITS_DUAL
:
case
2
:
spi
->
mode
|=
SPI_TX_DUAL
;
spi
->
mode
|=
SPI_TX_DUAL
;
break
;
break
;
case
SPI_NBITS_QUAD
:
case
4
:
spi
->
mode
|=
SPI_TX_QUAD
;
spi
->
mode
|=
SPI_TX_QUAD
;
break
;
break
;
default:
default:
dev_err
(
&
master
->
dev
,
dev_err
(
&
master
->
dev
,
"spi-tx-bus-width %d not supported
\n
"
,
"spi-tx-bus-width %d not supported
\n
"
,
be32_to_cpup
(
prop
)
);
value
);
spi_dev_put
(
spi
);
spi_dev_put
(
spi
);
continue
;
continue
;
}
}
}
}
prop
=
of_get_property
(
nc
,
"spi-rx-bus-width"
,
&
len
);
if
(
!
of_property_read_u32
(
nc
,
"spi-rx-bus-width"
,
&
value
))
{
if
(
prop
&&
len
==
sizeof
(
*
prop
))
{
switch
(
value
)
{
switch
(
be32_to_cpup
(
prop
))
{
case
1
:
case
SPI_NBITS_SINGLE
:
break
;
break
;
case
SPI_NBITS_DUAL
:
case
2
:
spi
->
mode
|=
SPI_RX_DUAL
;
spi
->
mode
|=
SPI_RX_DUAL
;
break
;
break
;
case
SPI_NBITS_QUAD
:
case
4
:
spi
->
mode
|=
SPI_RX_QUAD
;
spi
->
mode
|=
SPI_RX_QUAD
;
break
;
break
;
default:
default:
dev_err
(
&
master
->
dev
,
dev_err
(
&
master
->
dev
,
"spi-rx-bus-width %d not supported
\n
"
,
"spi-rx-bus-width %d not supported
\n
"
,
be32_to_cpup
(
prop
)
);
value
);
spi_dev_put
(
spi
);
spi_dev_put
(
spi
);
continue
;
continue
;
}
}
}
}
/* Device speed */
/* Device speed */
prop
=
of_get_property
(
nc
,
"spi-max-frequency"
,
&
len
);
rc
=
of_property_read_u32
(
nc
,
"spi-max-frequency"
,
&
value
);
if
(
!
prop
||
len
<
sizeof
(
*
prop
)
)
{
if
(
rc
)
{
dev_err
(
&
master
->
dev
,
"%s has no
'spi-max-frequency' property
\n
"
,
dev_err
(
&
master
->
dev
,
"%s has no
valid 'spi-max-frequency' property (%d)
\n
"
,
nc
->
full_name
);
nc
->
full_name
,
rc
);
spi_dev_put
(
spi
);
spi_dev_put
(
spi
);
continue
;
continue
;
}
}
spi
->
max_speed_hz
=
be32_to_cpup
(
prop
)
;
spi
->
max_speed_hz
=
value
;
/* IRQ */
/* IRQ */
spi
->
irq
=
irq_of_parse_and_map
(
nc
,
0
);
spi
->
irq
=
irq_of_parse_and_map
(
nc
,
0
);
...
@@ -944,9 +942,7 @@ static void of_register_spi_devices(struct spi_master *master)
...
@@ -944,9 +942,7 @@ static void of_register_spi_devices(struct spi_master *master)
spi
->
dev
.
of_node
=
nc
;
spi
->
dev
.
of_node
=
nc
;
/* Register the new device */
/* Register the new device */
snprintf
(
modalias
,
sizeof
(
modalias
),
"%s%s"
,
SPI_MODULE_PREFIX
,
request_module
(
"%s%s"
,
SPI_MODULE_PREFIX
,
spi
->
modalias
);
spi
->
modalias
);
request_module
(
modalias
);
rc
=
spi_add_device
(
spi
);
rc
=
spi_add_device
(
spi
);
if
(
rc
)
{
if
(
rc
)
{
dev_err
(
&
master
->
dev
,
"spi_device register error %s
\n
"
,
dev_err
(
&
master
->
dev
,
"spi_device register error %s
\n
"
,
...
@@ -1097,7 +1093,7 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
...
@@ -1097,7 +1093,7 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
if
(
!
dev
)
if
(
!
dev
)
return
NULL
;
return
NULL
;
master
=
kzalloc
(
size
+
sizeof
*
master
,
GFP_KERNEL
);
master
=
kzalloc
(
size
+
sizeof
(
*
master
)
,
GFP_KERNEL
);
if
(
!
master
)
if
(
!
master
)
return
NULL
;
return
NULL
;
...
@@ -1122,7 +1118,7 @@ static int of_spi_register_master(struct spi_master *master)
...
@@ -1122,7 +1118,7 @@ static int of_spi_register_master(struct spi_master *master)
return
0
;
return
0
;
nb
=
of_gpio_named_count
(
np
,
"cs-gpios"
);
nb
=
of_gpio_named_count
(
np
,
"cs-gpios"
);
master
->
num_chipselect
=
max
(
nb
,
(
int
)
master
->
num_chipselect
);
master
->
num_chipselect
=
max
_t
(
int
,
nb
,
master
->
num_chipselect
);
/* Return error only for an incorrectly formed cs-gpios property */
/* Return error only for an incorrectly formed cs-gpios property */
if
(
nb
==
0
||
nb
==
-
ENOENT
)
if
(
nb
==
0
||
nb
==
-
ENOENT
)
...
@@ -1437,8 +1433,7 @@ int spi_setup(struct spi_device *spi)
...
@@ -1437,8 +1433,7 @@ int spi_setup(struct spi_device *spi)
if
(
spi
->
master
->
setup
)
if
(
spi
->
master
->
setup
)
status
=
spi
->
master
->
setup
(
spi
);
status
=
spi
->
master
->
setup
(
spi
);
dev_dbg
(
&
spi
->
dev
,
"setup mode %d, %s%s%s%s"
dev_dbg
(
&
spi
->
dev
,
"setup mode %d, %s%s%s%s%u bits/w, %u Hz max --> %d
\n
"
,
"%u bits/w, %u Hz max --> %d
\n
"
,
(
int
)
(
spi
->
mode
&
(
SPI_CPOL
|
SPI_CPHA
)),
(
int
)
(
spi
->
mode
&
(
SPI_CPOL
|
SPI_CPHA
)),
(
spi
->
mode
&
SPI_CS_HIGH
)
?
"cs_high, "
:
""
,
(
spi
->
mode
&
SPI_CS_HIGH
)
?
"cs_high, "
:
""
,
(
spi
->
mode
&
SPI_LSB_FIRST
)
?
"lsb, "
:
""
,
(
spi
->
mode
&
SPI_LSB_FIRST
)
?
"lsb, "
:
""
,
...
@@ -1797,7 +1792,7 @@ int spi_bus_unlock(struct spi_master *master)
...
@@ -1797,7 +1792,7 @@ int spi_bus_unlock(struct spi_master *master)
EXPORT_SYMBOL_GPL
(
spi_bus_unlock
);
EXPORT_SYMBOL_GPL
(
spi_bus_unlock
);
/* portable code must never pass more than 32 bytes */
/* portable code must never pass more than 32 bytes */
#define SPI_BUFSIZ max(32,SMP_CACHE_BYTES)
#define SPI_BUFSIZ max(32,
SMP_CACHE_BYTES)
static
u8
*
buf
;
static
u8
*
buf
;
...
@@ -1846,7 +1841,7 @@ int spi_write_then_read(struct spi_device *spi,
...
@@ -1846,7 +1841,7 @@ int spi_write_then_read(struct spi_device *spi,
}
}
spi_message_init
(
&
message
);
spi_message_init
(
&
message
);
memset
(
x
,
0
,
sizeof
x
);
memset
(
x
,
0
,
sizeof
(
x
)
);
if
(
n_tx
)
{
if
(
n_tx
)
{
x
[
0
].
len
=
n_tx
;
x
[
0
].
len
=
n_tx
;
spi_message_add_tail
(
&
x
[
0
],
&
message
);
spi_message_add_tail
(
&
x
[
0
],
&
message
);
...
...
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