diff options
| author | Jochen Friedrich <jochen@scram.de> | 2011-11-27 16:00:54 -0500 |
|---|---|---|
| committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-01-08 18:37:33 -0500 |
| commit | 5dd7bf59e0e8563265b3e5b33276099ef628fcc7 (patch) | |
| tree | 1372dd626865e4ed21cac103a706f06ef6ff700e | |
| parent | c9531227b289947950cce29cfe881b768bf9d7d9 (diff) | |
ARM: sa11x0: Implement autoloading of codec and codec pdata for mcp bus.
Signed-off-by: Jochen Friedrich <jochen@scram.de>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
| -rw-r--r-- | arch/arm/mach-sa1100/assabet.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/cerf.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/collie.c | 8 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/include/mach/mcp.h | 2 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/lart.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/shannon.c | 1 | ||||
| -rw-r--r-- | arch/arm/mach-sa1100/simpad.c | 8 | ||||
| -rw-r--r-- | drivers/mfd/mcp-core.c | 44 | ||||
| -rw-r--r-- | drivers/mfd/mcp-sa11x0.c | 7 | ||||
| -rw-r--r-- | drivers/mfd/ucb1x00-core.c | 48 | ||||
| -rw-r--r-- | drivers/mfd/ucb1x00-ts.c | 2 | ||||
| -rw-r--r-- | include/linux/mfd/mcp.h | 7 | ||||
| -rw-r--r-- | include/linux/mfd/ucb1x00.h | 5 | ||||
| -rw-r--r-- | include/linux/mod_devicetable.h | 11 | ||||
| -rw-r--r-- | scripts/mod/file2alias.c | 13 |
15 files changed, 138 insertions, 21 deletions
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index 3dd133f18415..14b31f116ef9 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c | |||
| @@ -202,6 +202,7 @@ static struct irda_platform_data assabet_irda_data = { | |||
| 202 | static struct mcp_plat_data assabet_mcp_data = { | 202 | static struct mcp_plat_data assabet_mcp_data = { |
| 203 | .mccr0 = MCCR0_ADM, | 203 | .mccr0 = MCCR0_ADM, |
| 204 | .sclk_rate = 11981000, | 204 | .sclk_rate = 11981000, |
| 205 | .codec = "ucb1x00", | ||
| 205 | }; | 206 | }; |
| 206 | 207 | ||
| 207 | static void __init assabet_init(void) | 208 | static void __init assabet_init(void) |
diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index 7f3da4b11ec9..b7db7cd08305 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c | |||
| @@ -124,6 +124,7 @@ static void __init cerf_map_io(void) | |||
| 124 | static struct mcp_plat_data cerf_mcp_data = { | 124 | static struct mcp_plat_data cerf_mcp_data = { |
| 125 | .mccr0 = MCCR0_ADM, | 125 | .mccr0 = MCCR0_ADM, |
| 126 | .sclk_rate = 11981000, | 126 | .sclk_rate = 11981000, |
| 127 | .codec = "ucb1x00", | ||
| 127 | }; | 128 | }; |
| 128 | 129 | ||
| 129 | static void __init cerf_init(void) | 130 | static void __init cerf_init(void) |
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index 2965cc9d424e..b0b5efee683b 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/timer.h> | 27 | #include <linux/timer.h> |
| 28 | #include <linux/gpio.h> | 28 | #include <linux/gpio.h> |
| 29 | #include <linux/pda_power.h> | 29 | #include <linux/pda_power.h> |
| 30 | #include <linux/mfd/ucb1x00.h> | ||
| 30 | 31 | ||
| 31 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
| 32 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
| @@ -85,10 +86,15 @@ static struct scoop_pcmcia_config collie_pcmcia_config = { | |||
| 85 | .num_devs = 1, | 86 | .num_devs = 1, |
| 86 | }; | 87 | }; |
| 87 | 88 | ||
| 89 | static struct ucb1x00_plat_data collie_ucb1x00_data = { | ||
| 90 | .gpio_base = COLLIE_TC35143_GPIO_BASE, | ||
| 91 | }; | ||
| 92 | |||
| 88 | static struct mcp_plat_data collie_mcp_data = { | 93 | static struct mcp_plat_data collie_mcp_data = { |
| 89 | .mccr0 = MCCR0_ADM | MCCR0_ExtClk, | 94 | .mccr0 = MCCR0_ADM | MCCR0_ExtClk, |
| 90 | .sclk_rate = 9216000, | 95 | .sclk_rate = 9216000, |
| 91 | .gpio_base = COLLIE_TC35143_GPIO_BASE, | 96 | .codec = "ucb1x00", |
| 97 | .codec_pdata = &collie_ucb1x00_data, | ||
| 92 | }; | 98 | }; |
| 93 | 99 | ||
| 94 | /* | 100 | /* |
diff --git a/arch/arm/mach-sa1100/include/mach/mcp.h b/arch/arm/mach-sa1100/include/mach/mcp.h index ed1a331508a7..586cec898b35 100644 --- a/arch/arm/mach-sa1100/include/mach/mcp.h +++ b/arch/arm/mach-sa1100/include/mach/mcp.h | |||
| @@ -17,6 +17,8 @@ struct mcp_plat_data { | |||
| 17 | u32 mccr1; | 17 | u32 mccr1; |
| 18 | unsigned int sclk_rate; | 18 | unsigned int sclk_rate; |
| 19 | int gpio_base; | 19 | int gpio_base; |
| 20 | const char *codec; | ||
| 21 | void *codec_pdata; | ||
| 20 | }; | 22 | }; |
| 21 | 23 | ||
| 22 | #endif | 24 | #endif |
diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c index 5bc59d0947ba..34bbdd986e43 100644 --- a/arch/arm/mach-sa1100/lart.c +++ b/arch/arm/mach-sa1100/lart.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | static struct mcp_plat_data lart_mcp_data = { | 24 | static struct mcp_plat_data lart_mcp_data = { |
| 25 | .mccr0 = MCCR0_ADM, | 25 | .mccr0 = MCCR0_ADM, |
| 26 | .sclk_rate = 11981000, | 26 | .sclk_rate = 11981000, |
| 27 | .codec = "ucb1x00", | ||
| 27 | }; | 28 | }; |
| 28 | 29 | ||
| 29 | static void __init lart_init(void) | 30 | static void __init lart_init(void) |
diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index 1cccbf5b9e9a..252faa5e2395 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c | |||
| @@ -55,6 +55,7 @@ static struct resource shannon_flash_resource = { | |||
| 55 | static struct mcp_plat_data shannon_mcp_data = { | 55 | static struct mcp_plat_data shannon_mcp_data = { |
| 56 | .mccr0 = MCCR0_ADM, | 56 | .mccr0 = MCCR0_ADM, |
| 57 | .sclk_rate = 11981000, | 57 | .sclk_rate = 11981000, |
| 58 | .codec = "ucb1x00", | ||
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | static void __init shannon_init(void) | 61 | static void __init shannon_init(void) |
diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index 4790f3f3d008..7eac8ebab94e 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/mtd/partitions.h> | 14 | #include <linux/mtd/partitions.h> |
| 15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
| 16 | #include <linux/gpio.h> | 16 | #include <linux/gpio.h> |
| 17 | #include <linux/mfd/ucb1x00.h> | ||
| 17 | 18 | ||
| 18 | #include <asm/irq.h> | 19 | #include <asm/irq.h> |
| 19 | #include <mach/hardware.h> | 20 | #include <mach/hardware.h> |
| @@ -187,10 +188,15 @@ static struct resource simpad_flash_resources [] = { | |||
| 187 | } | 188 | } |
| 188 | }; | 189 | }; |
| 189 | 190 | ||
| 191 | static struct ucb1x00_plat_data simpad_ucb1x00_data = { | ||
| 192 | .gpio_base = SIMPAD_UCB1X00_GPIO_BASE, | ||
| 193 | }; | ||
| 194 | |||
| 190 | static struct mcp_plat_data simpad_mcp_data = { | 195 | static struct mcp_plat_data simpad_mcp_data = { |
| 191 | .mccr0 = MCCR0_ADM, | 196 | .mccr0 = MCCR0_ADM, |
| 192 | .sclk_rate = 11981000, | 197 | .sclk_rate = 11981000, |
| 193 | .gpio_base = SIMPAD_UCB1X00_GPIO_BASE, | 198 | .codec = "ucb1300", |
| 199 | .codec_pdata = &simpad_ucb1x00_data, | ||
| 194 | }; | 200 | }; |
| 195 | 201 | ||
| 196 | 202 | ||
diff --git a/drivers/mfd/mcp-core.c b/drivers/mfd/mcp-core.c index 84815f9ef636..63be60bc3455 100644 --- a/drivers/mfd/mcp-core.c +++ b/drivers/mfd/mcp-core.c | |||
| @@ -26,9 +26,35 @@ | |||
| 26 | #define to_mcp(d) container_of(d, struct mcp, attached_device) | 26 | #define to_mcp(d) container_of(d, struct mcp, attached_device) |
| 27 | #define to_mcp_driver(d) container_of(d, struct mcp_driver, drv) | 27 | #define to_mcp_driver(d) container_of(d, struct mcp_driver, drv) |
| 28 | 28 | ||
| 29 | static const struct mcp_device_id *mcp_match_id(const struct mcp_device_id *id, | ||
| 30 | const char *codec) | ||
| 31 | { | ||
| 32 | while (id->name[0]) { | ||
| 33 | if (strcmp(codec, id->name) == 0) | ||
| 34 | return id; | ||
| 35 | id++; | ||
| 36 | } | ||
| 37 | return NULL; | ||
| 38 | } | ||
| 39 | |||
| 40 | const struct mcp_device_id *mcp_get_device_id(const struct mcp *mcp) | ||
| 41 | { | ||
| 42 | const struct mcp_driver *driver = | ||
| 43 | to_mcp_driver(mcp->attached_device.driver); | ||
| 44 | |||
| 45 | return mcp_match_id(driver->id_table, mcp->codec); | ||
| 46 | } | ||
| 47 | EXPORT_SYMBOL(mcp_get_device_id); | ||
| 48 | |||
| 29 | static int mcp_bus_match(struct device *dev, struct device_driver *drv) | 49 | static int mcp_bus_match(struct device *dev, struct device_driver *drv) |
| 30 | { | 50 | { |
| 31 | return 1; | 51 | const struct mcp *mcp = to_mcp(dev); |
| 52 | const struct mcp_driver *driver = to_mcp_driver(drv); | ||
| 53 | |||
| 54 | if (driver->id_table) | ||
| 55 | return !!mcp_match_id(driver->id_table, mcp->codec); | ||
| 56 | |||
| 57 | return 0; | ||
| 32 | } | 58 | } |
| 33 | 59 | ||
| 34 | static int mcp_bus_probe(struct device *dev) | 60 | static int mcp_bus_probe(struct device *dev) |
| @@ -74,9 +100,18 @@ static int mcp_bus_resume(struct device *dev) | |||
| 74 | return ret; | 100 | return ret; |
| 75 | } | 101 | } |
| 76 | |||
