Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
0e52fe8c
Commit
0e52fe8c
authored
Aug 29, 2008
by
David S. Miller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sun_uflash: Convert to pure OF driver.
Signed-off-by:
David S. Miller
<
davem@davemloft.net
>
parent
8ab0dc33
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
35 additions
and
38 deletions
+35
-38
drivers/mtd/maps/sun_uflash.c
drivers/mtd/maps/sun_uflash.c
+35
-38
No files found.
drivers/mtd/maps/sun_uflash.c
View file @
0e52fe8c
/*
/* sun_uflash.c - Driver for user-programmable flash on
*
* Sun Microsystems SME boardsets.
* sun_uflash - Driver implementation for user-programmable flash
* present on many Sun Microsystems SME boardsets.
*
*
* This driver does NOT provide access to the OBP-flash for
* This driver does NOT provide access to the OBP-flash for
* safety reasons-- use <linux>/drivers/sbus/char/flash.c instead.
* safety reasons-- use <linux>/drivers/sbus/char/flash.c instead.
*
*
* Copyright (c) 2001 Eric Brower (ebrower@usa.net)
* Copyright (c) 2001 Eric Brower (ebrower@usa.net)
*
*/
*/
#include <linux/kernel.h>
#include <linux/kernel.h>
...
@@ -16,8 +13,8 @@
...
@@ -16,8 +13,8 @@
#include <linux/errno.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/init.h>
#include <linux/ioport.h>
#include <linux/ioport.h>
#include <
asm/ebus
.h>
#include <
linux/of
.h>
#include <
asm/oplib
.h>
#include <
linux/of_device
.h>
#include <asm/prom.h>
#include <asm/prom.h>
#include <asm/uaccess.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/io.h>
...
@@ -26,67 +23,65 @@
...
@@ -26,67 +23,65 @@
#include <linux/mtd/map.h>
#include <linux/mtd/map.h>
#define UFLASH_OBPNAME "flashprom"
#define UFLASH_OBPNAME "flashprom"
#define UFLASH_DEVNAME "userflash"
#define DRIVER_NAME "sun_uflash"
#define PFX DRIVER_NAME ": "
#define UFLASH_WINDOW_SIZE 0x200000
#define UFLASH_WINDOW_SIZE 0x200000
#define UFLASH_BUSWIDTH 1
/* EBus is 8-bit */
#define UFLASH_BUSWIDTH 1
/* EBus is 8-bit */
MODULE_AUTHOR
(
"Eric Brower <ebrower@usa.net>"
);
MODULE_AUTHOR
(
"Eric Brower <ebrower@usa.net>"
);
MODULE_DESCRIPTION
(
"User-programmable flash device on Sun Microsystems boardsets"
);
MODULE_DESCRIPTION
(
"User-programmable flash device on Sun Microsystems boardsets"
);
MODULE_SUPPORTED_DEVICE
(
"userflash"
);
MODULE_SUPPORTED_DEVICE
(
DRIVER_NAME
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_VERSION
(
"2.
0
"
);
MODULE_VERSION
(
"2.
1
"
);
static
LIST_HEAD
(
device_list
);
struct
uflash_dev
{
struct
uflash_dev
{
const
char
*
name
;
/* device name */
const
char
*
name
;
/* device name */
struct
map_info
map
;
/* mtd map info */
struct
map_info
map
;
/* mtd map info */
struct
mtd_info
*
mtd
;
/* mtd info */
struct
mtd_info
*
mtd
;
/* mtd info */
};
};
struct
map_info
uflash_map_templ
=
{
struct
map_info
uflash_map_templ
=
{
.
name
=
"SUNW,???-????"
,
.
name
=
"SUNW,???-????"
,
.
size
=
UFLASH_WINDOW_SIZE
,
.
size
=
UFLASH_WINDOW_SIZE
,
.
bankwidth
=
UFLASH_BUSWIDTH
,
.
bankwidth
=
UFLASH_BUSWIDTH
,
};
};
int
uflash_devinit
(
struct
linux_ebus_device
*
edev
,
struct
device_node
*
dp
)
int
uflash_devinit
(
struct
of_device
*
op
,
struct
device_node
*
dp
)
{
{
struct
uflash_dev
*
up
;
struct
uflash_dev
*
up
;
struct
resource
*
res
;
res
=
&
edev
->
resource
[
0
];
if
(
edev
->
num_addrs
!=
1
)
{
if
(
op
->
resource
[
1
].
flags
)
{
/* Non-CFI userflash device-- once I find one we
/* Non-CFI userflash device-- once I find one we
* can work on supporting it.
* can work on supporting it.
*/
*/
printk
(
"%s: unsupported device at 0x%llx (%d regs): "
\
printk
(
KERN_ERR
PFX
"Unsupported device at %s, 0x%llx
\n
"
,
"email ebrower@usa.net
\n
"
,
dp
->
full_name
,
(
unsigned
long
long
)
op
->
resource
[
0
].
start
);
dp
->
full_name
,
(
unsigned
long
long
)
res
->
start
,
edev
->
num_addrs
);
return
-
ENODEV
;
return
-
ENODEV
;
}
}
up
=
kzalloc
(
sizeof
(
struct
uflash_dev
),
GFP_KERNEL
);
up
=
kzalloc
(
sizeof
(
struct
uflash_dev
),
GFP_KERNEL
);
if
(
!
up
)
if
(
!
up
)
{
printk
(
KERN_ERR
PFX
"Cannot allocate struct uflash_dev
\n
"
);
return
-
ENOMEM
;
return
-
ENOMEM
;
}
/* copy defaults and tweak parameters */
/* copy defaults and tweak parameters */
memcpy
(
&
up
->
map
,
&
uflash_map_templ
,
sizeof
(
uflash_map_templ
));
memcpy
(
&
up
->
map
,
&
uflash_map_templ
,
sizeof
(
uflash_map_templ
));
up
->
map
.
size
=
(
res
->
end
-
res
->
start
)
+
1UL
;
up
->
map
.
size
=
resource_size
(
&
op
->
resource
[
0
]);
up
->
name
=
of_get_property
(
dp
,
"model"
,
NULL
);
up
->
name
=
of_get_property
(
dp
,
"model"
,
NULL
);
if
(
up
->
name
&&
0
<
strlen
(
up
->
name
))
if
(
up
->
name
&&
0
<
strlen
(
up
->
name
))
up
->
map
.
name
=
(
char
*
)
up
->
name
;
up
->
map
.
name
=
(
char
*
)
up
->
name
;
up
->
map
.
phys
=
res
->
start
;
up
->
map
.
phys
=
op
->
resource
[
0
].
start
;
up
->
map
.
virt
=
ioremap_nocache
(
res
->
start
,
up
->
map
.
size
);
up
->
map
.
virt
=
of_ioremap
(
&
op
->
resource
[
0
],
0
,
up
->
map
.
size
,
DRIVER_NAME
);
if
(
!
up
->
map
.
virt
)
{
if
(
!
up
->
map
.
virt
)
{
printk
(
"%s: Failed to map device.
\n
"
,
dp
->
full_name
);
printk
(
KERN_ERR
PFX
"Failed to map device.
\n
"
);
kfree
(
up
);
kfree
(
up
);
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -97,7 +92,7 @@ int uflash_devinit(struct linux_ebus_device *edev, struct device_node *dp)
...
@@ -97,7 +92,7 @@ int uflash_devinit(struct linux_ebus_device *edev, struct device_node *dp)
/* MTD registration */
/* MTD registration */
up
->
mtd
=
do_map_probe
(
"cfi_probe"
,
&
up
->
map
);
up
->
mtd
=
do_map_probe
(
"cfi_probe"
,
&
up
->
map
);
if
(
!
up
->
mtd
)
{
if
(
!
up
->
mtd
)
{
iounmap
(
up
->
map
.
virt
);
of_iounmap
(
&
op
->
resource
[
0
],
up
->
map
.
virt
,
up
->
map
.
size
);
kfree
(
up
);
kfree
(
up
);
return
-
ENXIO
;
return
-
ENXIO
;
...
@@ -107,32 +102,34 @@ int uflash_devinit(struct linux_ebus_device *edev, struct device_node *dp)
...
@@ -107,32 +102,34 @@ int uflash_devinit(struct linux_ebus_device *edev, struct device_node *dp)
add_mtd_device
(
up
->
mtd
);
add_mtd_device
(
up
->
mtd
);
dev_set_drvdata
(
&
edev
->
ofdev
.
dev
,
up
);
dev_set_drvdata
(
&
op
->
dev
,
up
);
return
0
;
return
0
;
}
}
static
int
__devinit
uflash_probe
(
struct
of_device
*
dev
,
const
struct
of_device_id
*
match
)
static
int
__devinit
uflash_probe
(
struct
of_device
*
op
,
const
struct
of_device_id
*
match
)
{
{
struct
linux_ebus_device
*
edev
=
to_ebus_device
(
&
dev
->
dev
);
struct
device_node
*
dp
=
op
->
node
;
struct
device_node
*
dp
=
dev
->
node
;
if
(
of_find_property
(
dp
,
"user"
,
NULL
))
/* Flashprom must have the "user" property in order to
* be used by this driver.
*/
if
(
!
of_find_property
(
dp
,
"user"
,
NULL
))
return
-
ENODEV
;
return
-
ENODEV
;
return
uflash_devinit
(
edev
,
dp
);
return
uflash_devinit
(
op
,
dp
);
}
}
static
int
__devexit
uflash_remove
(
struct
of_device
*
dev
)
static
int
__devexit
uflash_remove
(
struct
of_device
*
op
)
{
{
struct
uflash_dev
*
up
=
dev_get_drvdata
(
&
dev
->
dev
);
struct
uflash_dev
*
up
=
dev_get_drvdata
(
&
op
->
dev
);
if
(
up
->
mtd
)
{
if
(
up
->
mtd
)
{
del_mtd_device
(
up
->
mtd
);
del_mtd_device
(
up
->
mtd
);
map_destroy
(
up
->
mtd
);
map_destroy
(
up
->
mtd
);
}
}
if
(
up
->
map
.
virt
)
{
if
(
up
->
map
.
virt
)
{
iounmap
(
up
->
map
.
virt
);
of_iounmap
(
&
op
->
resource
[
0
],
up
->
map
.
virt
,
up
->
map
.
size
);
up
->
map
.
virt
=
NULL
;
up
->
map
.
virt
=
NULL
;
}
}
...
@@ -151,7 +148,7 @@ static struct of_device_id uflash_match[] = {
...
@@ -151,7 +148,7 @@ static struct of_device_id uflash_match[] = {
MODULE_DEVICE_TABLE
(
of
,
uflash_match
);
MODULE_DEVICE_TABLE
(
of
,
uflash_match
);
static
struct
of_platform_driver
uflash_driver
=
{
static
struct
of_platform_driver
uflash_driver
=
{
.
name
=
UFLASH_DEV
NAME
,
.
name
=
DRIVER_
NAME
,
.
match_table
=
uflash_match
,
.
match_table
=
uflash_match
,
.
probe
=
uflash_probe
,
.
probe
=
uflash_probe
,
.
remove
=
__devexit_p
(
uflash_remove
),
.
remove
=
__devexit_p
(
uflash_remove
),
...
@@ -159,7 +156,7 @@ static struct of_platform_driver uflash_driver = {
...
@@ -159,7 +156,7 @@ static struct of_platform_driver uflash_driver = {
static
int
__init
uflash_init
(
void
)
static
int
__init
uflash_init
(
void
)
{
{
return
of_register_driver
(
&
uflash_driver
,
&
ebus
_bus_type
);
return
of_register_driver
(
&
uflash_driver
,
&
of
_bus_type
);
}
}
static
void
__exit
uflash_exit
(
void
)
static
void
__exit
uflash_exit
(
void
)
...
...
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