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
3b38bea0
Commit
3b38bea0
authored
Jun 16, 2007
by
Pierre Ossman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sdio: add device id table and matching
Signed-off-by:
Pierre Ossman
<
drzeus@drzeus.cx
>
parent
26074962
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
92 additions
and
7 deletions
+92
-7
drivers/mmc/core/sdio_bus.c
drivers/mmc/core/sdio_bus.c
+52
-6
include/linux/mmc/sdio_func.h
include/linux/mmc/sdio_func.h
+29
-1
include/linux/mod_devicetable.h
include/linux/mod_devicetable.h
+11
-0
No files found.
drivers/mmc/core/sdio_bus.c
View file @
3b38bea0
...
...
@@ -21,14 +21,47 @@
#include "sdio_bus.h"
#define dev_to_sdio_func(d) container_of(d, struct sdio_func, dev)
#define to_sdio_driver(d) container_of(d, struct sdio_driver, drv)
static
const
struct
sdio_device_id
*
sdio_match_one
(
struct
sdio_func
*
func
,
const
struct
sdio_device_id
*
id
)
{
if
(
id
->
class
!=
(
__u8
)
SDIO_ANY_ID
&&
id
->
class
!=
func
->
class
)
return
NULL
;
if
(
id
->
vendor
!=
(
__u16
)
SDIO_ANY_ID
&&
id
->
vendor
!=
func
->
vendor
)
return
NULL
;
if
(
id
->
device
!=
(
__u16
)
SDIO_ANY_ID
&&
id
->
device
!=
func
->
device
)
return
NULL
;
return
id
;
}
static
const
struct
sdio_device_id
*
sdio_match_device
(
struct
sdio_func
*
func
,
struct
sdio_driver
*
sdrv
)
{
const
struct
sdio_device_id
*
ids
;
ids
=
sdrv
->
id_table
;
if
(
ids
)
{
while
(
ids
->
class
||
ids
->
vendor
||
ids
->
device
)
{
if
(
sdio_match_one
(
func
,
ids
))
return
ids
;
ids
++
;
}
}
return
NULL
;
}
/*
* This currently matches any SDIO function to any driver in order
* to help initial development and testing.
*/
static
int
sdio_bus_match
(
struct
device
*
dev
,
struct
device_driver
*
drv
)
{
return
1
;
struct
sdio_func
*
func
=
dev_to_sdio_func
(
dev
);
struct
sdio_driver
*
sdrv
=
to_sdio_driver
(
drv
);
if
(
sdio_match_device
(
func
,
sdrv
))
return
1
;
return
0
;
}
static
int
...
...
@@ -42,11 +75,24 @@ sdio_bus_uevent(struct device *dev, char **envp, int num_envp, char *buf,
static
int
sdio_bus_probe
(
struct
device
*
dev
)
{
return
-
ENODEV
;
struct
sdio_driver
*
drv
=
to_sdio_driver
(
dev
->
driver
);
struct
sdio_func
*
func
=
dev_to_sdio_func
(
dev
);
const
struct
sdio_device_id
*
id
;
id
=
sdio_match_device
(
func
,
drv
);
if
(
!
id
)
return
-
ENODEV
;
return
drv
->
probe
(
func
,
id
);
}
static
int
sdio_bus_remove
(
struct
device
*
dev
)
{
struct
sdio_driver
*
drv
=
to_sdio_driver
(
dev
->
driver
);
struct
sdio_func
*
func
=
dev_to_sdio_func
(
dev
);
drv
->
remove
(
func
);
return
0
;
}
...
...
include/linux/mmc/sdio_func.h
View file @
3b38bea0
...
...
@@ -12,6 +12,9 @@
#ifndef MMC_SDIO_FUNC_H
#define MMC_SDIO_FUNC_H
#include <linux/device.h>
#include <linux/mod_devicetable.h>
struct
mmc_card
;
/*
...
...
@@ -58,13 +61,38 @@ struct sdio_func {
*/
struct
sdio_driver
{
char
*
name
;
const
struct
sdio_device_id
*
id_table
;
int
(
*
probe
)(
struct
sdio_func
*
);
int
(
*
probe
)(
struct
sdio_func
*
,
const
struct
sdio_device_id
*
);
void
(
*
remove
)(
struct
sdio_func
*
);
struct
device_driver
drv
;
};
/**
* SDIO_DEVICE - macro used to describe a specific SDIO device
* @vend: the 16 bit manufacturer code
* @dev: the 16 bit function id
*
* This macro is used to create a struct sdio_device_id that matches a
* specific device. The class field will be set to SDIO_ANY_ID.
*/
#define SDIO_DEVICE(vend,dev) \
.class = SDIO_ANY_ID, \
.vendor = (vend), .device = (dev)
/**
* SDIO_DEVICE_CLASS - macro used to describe a specific SDIO device class
* @dev_class: the 8 bit standard interface code
*
* This macro is used to create a struct sdio_device_id that matches a
* specific standard SDIO function type. The vendor and device fields will
* be set to SDIO_ANY_ID.
*/
#define SDIO_DEVICE_CLASS(dev_class) \
.class = (dev_class), \
.vendor = SDIO_ANY_ID, .device = SDIO_ANY_ID
extern
int
sdio_register_driver
(
struct
sdio_driver
*
);
extern
void
sdio_unregister_driver
(
struct
sdio_driver
*
);
...
...
include/linux/mod_devicetable.h
View file @
3b38bea0
...
...
@@ -340,4 +340,15 @@ struct parisc_device_id {
#define PA_HVERSION_ANY_ID 0xffff
#define PA_SVERSION_ANY_ID 0xffffffff
/* SDIO */
#define SDIO_ANY_ID (~0)
struct
sdio_device_id
{
__u8
class
;
/* Standard interface or SDIO_ANY_ID */
__u16
vendor
;
/* Vendor or SDIO_ANY_ID */
__u16
device
;
/* Device ID or SDIO_ANY_ID */
kernel_ulong_t
driver_data
;
/* Data private to the driver */
};
#endif
/* LINUX_MOD_DEVICETABLE_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