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
bd1f7936
Commit
bd1f7936
authored
Jan 13, 2009
by
Benjamin Herrenschmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge commit 'gcl/gcl-next' into next
parents
30aae739
ff82c587
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
113 additions
and
62 deletions
+113
-62
arch/powerpc/platforms/512x/clock.c
arch/powerpc/platforms/512x/clock.c
+2
-2
arch/powerpc/platforms/52xx/mpc52xx_gpio.c
arch/powerpc/platforms/52xx/mpc52xx_gpio.c
+0
-3
arch/powerpc/platforms/52xx/mpc52xx_pic.c
arch/powerpc/platforms/52xx/mpc52xx_pic.c
+7
-1
drivers/block/xsysace.c
drivers/block/xsysace.c
+1
-0
drivers/of/of_i2c.c
drivers/of/of_i2c.c
+19
-0
drivers/spi/xilinx_spi.c
drivers/spi/xilinx_spi.c
+81
-56
include/linux/of_i2c.h
include/linux/of_i2c.h
+3
-0
No files found.
arch/powerpc/platforms/512x/clock.c
View file @
bd1f7936
...
...
@@ -56,12 +56,12 @@ static struct clk *mpc5121_clk_get(struct device *dev, const char *id)
int
dev_match
=
0
;
int
id_match
=
0
;
if
(
dev
==
NULL
&&
id
==
NULL
)
if
(
dev
==
NULL
||
id
==
NULL
)
return
NULL
;
mutex_lock
(
&
clocks_mutex
);
list_for_each_entry
(
p
,
&
clocks
,
node
)
{
if
(
dev
&&
dev
==
p
->
dev
)
if
(
dev
==
p
->
dev
)
dev_match
++
;
if
(
strcmp
(
id
,
p
->
name
)
==
0
)
id_match
++
;
...
...
arch/powerpc/platforms/52xx/mpc52xx_gpio.c
View file @
bd1f7936
...
...
@@ -363,11 +363,8 @@ static int mpc52xx_gpt_gpio_get(struct gpio_chip *gc, unsigned int gpio)
{
struct
of_mm_gpio_chip
*
mm_gc
=
to_of_mm_gpio_chip
(
gc
);
struct
mpc52xx_gpt
__iomem
*
regs
=
mm_gc
->
regs
;
unsigned
int
ret
;
return
(
in_be32
(
&
regs
->
status
)
&
(
1
<<
(
31
-
23
)))
?
1
:
0
;
return
ret
;
}
static
void
...
...
arch/powerpc/platforms/52xx/mpc52xx_pic.c
View file @
bd1f7936
...
...
@@ -196,6 +196,7 @@ static void mpc52xx_extirq_ack(unsigned int virq)
static
int
mpc52xx_extirq_set_type
(
unsigned
int
virq
,
unsigned
int
flow_type
)
{
struct
irq_desc
*
desc
=
get_irq_desc
(
virq
);
u32
ctrl_reg
,
type
;
int
irq
;
int
l2irq
;
...
...
@@ -222,6 +223,11 @@ static int mpc52xx_extirq_set_type(unsigned int virq, unsigned int flow_type)
type
=
0
;
}
desc
->
status
&=
~
(
IRQ_TYPE_SENSE_MASK
|
IRQ_LEVEL
);
desc
->
status
|=
flow_type
&
IRQ_TYPE_SENSE_MASK
;
if
(
flow_type
&
(
IRQ_TYPE_LEVEL_HIGH
|
IRQ_TYPE_LEVEL_LOW
))
desc
->
status
|=
IRQ_LEVEL
;
ctrl_reg
=
in_be32
(
&
intr
->
ctrl
);
ctrl_reg
&=
~
(
0x3
<<
(
22
-
(
l2irq
*
2
)));
ctrl_reg
|=
(
type
<<
(
22
-
(
l2irq
*
2
)));
...
...
@@ -231,7 +237,7 @@ static int mpc52xx_extirq_set_type(unsigned int virq, unsigned int flow_type)
}
static
struct
irq_chip
mpc52xx_extirq_irqchip
=
{
.
typename
=
"
MPC52xx IRQ[0-3]
"
,
.
typename
=
"
MPC52xx External
"
,
.
mask
=
mpc52xx_extirq_mask
,
.
unmask
=
mpc52xx_extirq_unmask
,
.
ack
=
mpc52xx_extirq_ack
,
...
...
drivers/block/xsysace.c
View file @
bd1f7936
...
...
@@ -1206,6 +1206,7 @@ static struct of_device_id ace_of_match[] __devinitdata = {
{
.
compatible
=
"xlnx,opb-sysace-1.00.b"
,
},
{
.
compatible
=
"xlnx,opb-sysace-1.00.c"
,
},
{
.
compatible
=
"xlnx,xps-sysace-1.00.a"
,
},
{
.
compatible
=
"xlnx,sysace"
,
},
{},
};
MODULE_DEVICE_TABLE
(
of
,
ace_of_match
);
...
...
drivers/of/of_i2c.c
View file @
bd1f7936
...
...
@@ -66,4 +66,23 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
}
EXPORT_SYMBOL
(
of_register_i2c_devices
);
static
int
of_dev_node_match
(
struct
device
*
dev
,
void
*
data
)
{
return
dev_archdata_get_node
(
&
dev
->
archdata
)
==
data
;
}
/* must call put_device() when done with returned i2c_client device */
struct
i2c_client
*
of_find_i2c_device_by_node
(
struct
device_node
*
node
)
{
struct
device
*
dev
;
dev
=
bus_find_device
(
&
i2c_bus_type
,
NULL
,
node
,
of_dev_node_match
);
if
(
!
dev
)
return
NULL
;
return
to_i2c_client
(
dev
);
}
EXPORT_SYMBOL
(
of_find_i2c_device_by_node
);
MODULE_LICENSE
(
"GPL"
);
drivers/spi/xilinx_spi.c
View file @
bd1f7936
...
...
@@ -15,12 +15,15 @@
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/of_platform.h>
#include <linux/of_device.h>
#include <linux/of_spi.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h>
#include <linux/io.h>
#include <syslib/virtex_devices.h>
#define XILINX_SPI_NAME "xilinx_spi"
/* Register definitions as per "OPB Serial Peripheral Interface (SPI) (v1.00e)
...
...
@@ -144,23 +147,14 @@ static int xilinx_spi_setup_transfer(struct spi_device *spi,
struct
spi_transfer
*
t
)
{
u8
bits_per_word
;
u32
hz
;
struct
xilinx_spi
*
xspi
=
spi_master_get_devdata
(
spi
->
master
);
bits_per_word
=
(
t
)
?
t
->
bits_per_word
:
spi
->
bits_per_word
;
hz
=
(
t
)
?
t
->
speed_hz
:
spi
->
max_speed_hz
;
if
(
bits_per_word
!=
8
)
{
dev_err
(
&
spi
->
dev
,
"%s, unsupported bits_per_word=%d
\n
"
,
__func__
,
bits_per_word
);
return
-
EINVAL
;
}
if
(
hz
&&
xspi
->
speed_hz
>
hz
)
{
dev_err
(
&
spi
->
dev
,
"%s, unsupported clock rate %uHz
\n
"
,
__func__
,
hz
);
return
-
EINVAL
;
}
return
0
;
}
...
...
@@ -304,32 +298,38 @@ static irqreturn_t xilinx_spi_irq(int irq, void *dev_id)
return
IRQ_HANDLED
;
}
static
int
__init
xilinx_spi_probe
(
struct
platform_device
*
dev
)
static
int
__init
xilinx_spi_of_probe
(
struct
of_device
*
ofdev
,
const
struct
of_device_id
*
match
)
{
int
ret
=
0
;
struct
spi_master
*
master
;
struct
xilinx_spi
*
xspi
;
struct
xspi_platform_data
*
pdata
;
struct
resource
*
r
;
struct
resource
r_irq_struct
;
struct
resource
r_mem_struct
;
struct
resource
*
r_irq
=
&
r_irq_struct
;
struct
resource
*
r_mem
=
&
r_mem_struct
;
int
rc
=
0
;
const
u32
*
prop
;
int
len
;
/* Get resources(memory, IRQ) associated with the device */
master
=
spi_alloc_master
(
&
dev
->
dev
,
sizeof
(
struct
xilinx_spi
));
master
=
spi_alloc_master
(
&
of
dev
->
dev
,
sizeof
(
struct
xilinx_spi
));
if
(
master
==
NULL
)
{
return
-
ENOMEM
;
}
platform_set_drvdata
(
dev
,
master
);
pdata
=
dev
->
dev
.
platform_data
;
dev_set_drvdata
(
&
ofdev
->
dev
,
master
);
if
(
pdata
==
NULL
)
{
ret
=
-
ENODEV
;
rc
=
of_address_to_resource
(
ofdev
->
node
,
0
,
r_mem
);
if
(
rc
)
{
dev_warn
(
&
ofdev
->
dev
,
"invalid address
\n
"
);
goto
put_master
;
}
r
=
platform_get_resource
(
dev
,
IORESOURCE_MEM
,
0
);
if
(
r
==
NULL
)
{
ret
=
-
ENODEV
;
r
c
=
of_irq_to_resource
(
ofdev
->
node
,
0
,
r_irq
);
if
(
r
c
==
NO_IRQ
)
{
dev_warn
(
&
ofdev
->
dev
,
"no IRQ found
\n
"
)
;
goto
put_master
;
}
...
...
@@ -341,47 +341,57 @@ static int __init xilinx_spi_probe(struct platform_device *dev)
xspi
->
bitbang
.
master
->
setup
=
xilinx_spi_setup
;
init_completion
(
&
xspi
->
done
);
if
(
!
request_mem_region
(
r
->
start
,
r
->
end
-
r
->
start
+
1
,
XILINX_SPI_NAME
))
{
ret
=
-
ENXIO
;
xspi
->
irq
=
r_irq
->
start
;
if
(
!
request_mem_region
(
r_mem
->
start
,
r_mem
->
end
-
r_mem
->
start
+
1
,
XILINX_SPI_NAME
))
{
rc
=
-
ENXIO
;
dev_warn
(
&
ofdev
->
dev
,
"memory request failure
\n
"
);
goto
put_master
;
}
xspi
->
regs
=
ioremap
(
r
->
start
,
r
->
end
-
r
->
start
+
1
);
xspi
->
regs
=
ioremap
(
r
_mem
->
start
,
r_mem
->
end
-
r_mem
->
start
+
1
);
if
(
xspi
->
regs
==
NULL
)
{
ret
=
-
ENOMEM
;
rc
=
-
ENOMEM
;
dev_warn
(
&
ofdev
->
dev
,
"ioremap failure
\n
"
);
goto
put_master
;
}
xspi
->
irq
=
r_irq
->
start
;
ret
=
platform_get_irq
(
dev
,
0
);
if
(
ret
<
0
)
{
ret
=
-
ENXIO
;
goto
unmap_io
;
}
xspi
->
irq
=
ret
;
/* dynamic bus assignment */
master
->
bus_num
=
-
1
;
master
->
bus_num
=
pdata
->
bus_num
;
master
->
num_chipselect
=
pdata
->
num_chipselect
;
xspi
->
speed_hz
=
pdata
->
speed_hz
;
/* number of slave select bits is required */
prop
=
of_get_property
(
ofdev
->
node
,
"xlnx,num-ss-bits"
,
&
len
);
if
(
!
prop
||
len
<
sizeof
(
*
prop
))
{
dev_warn
(
&
ofdev
->
dev
,
"no 'xlnx,num-ss-bits' property
\n
"
);
goto
put_master
;
}
master
->
num_chipselect
=
*
prop
;
/* SPI controller initializations */
xspi_init_hw
(
xspi
->
regs
);
/* Register for SPI Interrupt */
ret
=
request_irq
(
xspi
->
irq
,
xilinx_spi_irq
,
0
,
XILINX_SPI_NAME
,
xspi
);
if
(
ret
!=
0
)
rc
=
request_irq
(
xspi
->
irq
,
xilinx_spi_irq
,
0
,
XILINX_SPI_NAME
,
xspi
);
if
(
rc
!=
0
)
{
dev_warn
(
&
ofdev
->
dev
,
"irq request failure: %d
\n
"
,
xspi
->
irq
);
goto
unmap_io
;
}
r
et
=
spi_bitbang_start
(
&
xspi
->
bitbang
);
if
(
r
et
!=
0
)
{
dev_err
(
&
dev
->
dev
,
"spi_bitbang_start FAILED
\n
"
);
r
c
=
spi_bitbang_start
(
&
xspi
->
bitbang
);
if
(
r
c
!=
0
)
{
dev_err
(
&
of
dev
->
dev
,
"spi_bitbang_start FAILED
\n
"
);
goto
free_irq
;
}
dev_info
(
&
dev
->
dev
,
"at 0x%08X mapped to 0x%08X, irq=%d
\n
"
,
r
->
start
,
(
u32
)
xspi
->
regs
,
xspi
->
irq
);
dev_info
(
&
of
dev
->
dev
,
"at 0x%08X mapped to 0x%08X, irq=%d
\n
"
,
(
unsigned
int
)
r_mem
->
start
,
(
u32
)
xspi
->
regs
,
xspi
->
irq
);
return
ret
;
/* Add any subnodes on the SPI bus */
of_register_spi_devices
(
master
,
ofdev
->
node
);
return
rc
;
free_irq:
free_irq
(
xspi
->
irq
,
xspi
);
...
...
@@ -389,21 +399,21 @@ static int __init xilinx_spi_probe(struct platform_device *dev)
iounmap
(
xspi
->
regs
);
put_master:
spi_master_put
(
master
);
return
r
et
;
return
r
c
;
}
static
int
__devexit
xilinx_spi_remove
(
struct
platform_device
*
dev
)
static
int
__devexit
xilinx_spi_remove
(
struct
of_device
*
of
dev
)
{
struct
xilinx_spi
*
xspi
;
struct
spi_master
*
master
;
master
=
platform_get_drvdata
(
dev
);
master
=
platform_get_drvdata
(
of
dev
);
xspi
=
spi_master_get_devdata
(
master
);
spi_bitbang_stop
(
&
xspi
->
bitbang
);
free_irq
(
xspi
->
irq
,
xspi
);
iounmap
(
xspi
->
regs
);
platform_set_drvdata
(
dev
,
0
);
dev_set_drvdata
(
&
ofdev
->
dev
,
0
);
spi_master_put
(
xspi
->
bitbang
.
master
);
return
0
;
...
...
@@ -412,27 +422,42 @@ static int __devexit xilinx_spi_remove(struct platform_device *dev)
/* work with hotplug and coldplug */
MODULE_ALIAS
(
"platform:"
XILINX_SPI_NAME
);
static
struct
platform_driver
xilinx_spi_driver
=
{
.
probe
=
xilinx_spi_probe
,
.
remove
=
__devexit_p
(
xilinx_spi_remove
),
static
int
__exit
xilinx_spi_of_remove
(
struct
of_device
*
op
)
{
return
xilinx_spi_remove
(
op
);
}
static
struct
of_device_id
xilinx_spi_of_match
[]
=
{
{
.
compatible
=
"xlnx,xps-spi-2.00.a"
,
},
{
.
compatible
=
"xlnx,xps-spi-2.00.b"
,
},
{}
};
MODULE_DEVICE_TABLE
(
of
,
xilinx_spi_of_match
);
static
struct
of_platform_driver
xilinx_spi_of_driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
"xilinx-xps-spi"
,
.
match_table
=
xilinx_spi_of_match
,
.
probe
=
xilinx_spi_of_probe
,
.
remove
=
__exit_p
(
xilinx_spi_of_remove
),
.
driver
=
{
.
name
=
XILINX_SPI_NAME
,
.
name
=
"xilinx-xps-spi"
,
.
owner
=
THIS_MODULE
,
},
};
static
int
__init
xilinx_spi_init
(
void
)
{
return
platform_driver_register
(
&
xilinx_spi
_driver
);
return
of_register_platform_driver
(
&
xilinx_spi_of
_driver
);
}
module_init
(
xilinx_spi_init
);
static
void
__exit
xilinx_spi_exit
(
void
)
{
platform_driver_unregister
(
&
xilinx_spi
_driver
);
of_unregister_platform_driver
(
&
xilinx_spi_of
_driver
);
}
module_exit
(
xilinx_spi_exit
);
MODULE_AUTHOR
(
"MontaVista Software, Inc. <source@mvista.com>"
);
MODULE_DESCRIPTION
(
"Xilinx SPI driver"
);
MODULE_LICENSE
(
"GPL"
);
include/linux/of_i2c.h
View file @
bd1f7936
...
...
@@ -17,4 +17,7 @@
void
of_register_i2c_devices
(
struct
i2c_adapter
*
adap
,
struct
device_node
*
adap_node
);
/* must call put_device() when done with returned i2c_client device */
struct
i2c_client
*
of_find_i2c_device_by_node
(
struct
device_node
*
node
);
#endif
/* __LINUX_OF_I2C_H */
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