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
nexedi
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
Hide 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