diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2013-09-02 04:31:08 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2013-09-02 04:31:08 -0400 |
commit | f4388ca7f1e7c19a406700b3d1d3bfbf15d14115 (patch) | |
tree | 1edb8323d6cfe88620ac0c3f3c0f6c8e61134c7d | |
parent | 62282180645a94f8686680bca464afd418511510 (diff) | |
parent | c6f39257c952bc7da974bf93255936ff2ece2c34 (diff) |
Merge branch 'topic/for-asoc'
-rw-r--r-- | drivers/mfd/davinci_voicecodec.c | 23 | ||||
-rw-r--r-- | drivers/mfd/twl6040.c | 43 | ||||
-rw-r--r-- | include/linux/mfd/davinci_voicecodec.h | 3 | ||||
-rw-r--r-- | include/linux/mfd/twl6040.h | 1 |
4 files changed, 46 insertions, 24 deletions
diff --git a/drivers/mfd/davinci_voicecodec.c b/drivers/mfd/davinci_voicecodec.c index fb64398506e9..013ba8159dcd 100644 --- a/drivers/mfd/davinci_voicecodec.c +++ b/drivers/mfd/davinci_voicecodec.c | |||
@@ -27,21 +27,16 @@ | |||
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
29 | #include <linux/clk.h> | 29 | #include <linux/clk.h> |
30 | #include <linux/regmap.h> | ||
30 | 31 | ||
31 | #include <sound/pcm.h> | 32 | #include <sound/pcm.h> |
32 | 33 | ||
33 | #include <linux/mfd/davinci_voicecodec.h> | 34 | #include <linux/mfd/davinci_voicecodec.h> |
34 | 35 | ||
35 | u32 davinci_vc_read(struct davinci_vc *davinci_vc, int reg) | 36 | static struct regmap_config davinci_vc_regmap = { |
36 | { | 37 | .reg_bits = 32, |
37 | return __raw_readl(davinci_vc->base + reg); | 38 | .val_bits = 32, |
38 | } | 39 | }; |
39 | |||
40 | void davinci_vc_write(struct davinci_vc *davinci_vc, | ||
41 | int reg, u32 val) | ||
42 | { | ||
43 | __raw_writel(val, davinci_vc->base + reg); | ||
44 | } | ||
45 | 40 | ||
46 | static int __init davinci_vc_probe(struct platform_device *pdev) | 41 | static int __init davinci_vc_probe(struct platform_device *pdev) |
47 | { | 42 | { |
@@ -74,6 +69,14 @@ static int __init davinci_vc_probe(struct platform_device *pdev) | |||
74 | goto fail; | 69 | goto fail; |
75 | } | 70 | } |
76 | 71 | ||
72 | davinci_vc->regmap = devm_regmap_init_mmio(&pdev->dev, | ||
73 | davinci_vc->base, | ||
74 | &davinci_vc_regmap); | ||
75 | if (IS_ERR(davinci_vc->regmap)) { | ||
76 | ret = PTR_ERR(davinci_vc->regmap); | ||
77 | goto fail; | ||
78 | } | ||
79 | |||
77 | res = platform_get_resource(pdev, IORESOURCE_DMA, 0); | 80 | res = platform_get_resource(pdev, IORESOURCE_DMA, 0); |
78 | if (!res) { | 81 | if (!res) { |
79 | dev_err(&pdev->dev, "no DMA resource\n"); | 82 | dev_err(&pdev->dev, "no DMA resource\n"); |
diff --git a/drivers/mfd/twl6040.c b/drivers/mfd/twl6040.c index 4d8d3b74d4e3..daf66942071c 100644 --- a/drivers/mfd/twl6040.c +++ b/drivers/mfd/twl6040.c | |||
@@ -58,15 +58,9 @@ int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg) | |||
58 | int ret; | 58 | int ret; |
59 | unsigned int val; | 59 | unsigned int val; |
60 | 60 | ||
61 | /* Vibra control registers from cache */ | 61 | ret = regmap_read(twl6040->regmap, reg, &val); |
62 | if (unlikely(reg == TWL6040_REG_VIBCTLL || | 62 | if (ret < 0) |
63 | reg == TWL6040_REG_VIBCTLR)) { | 63 | return ret; |
64 | val = twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)]; | ||
65 | } else { | ||
66 | ret = regmap_read(twl6040->regmap, reg, &val); | ||
67 | if (ret < 0) | ||
68 | return ret; | ||
69 | } | ||
70 | 64 | ||
71 | return val; | 65 | return val; |
72 | } | 66 | } |
@@ -77,9 +71,6 @@ int twl6040_reg_write(struct twl6040 *twl6040, unsigned int reg, u8 val) | |||
77 | int ret; | 71 | int ret; |
78 | 72 | ||
79 | ret = regmap_write(twl6040->regmap, reg, val); | 73 | ret = regmap_write(twl6040->regmap, reg, val); |
80 | /* Cache the vibra control registers */ | ||
81 | if (reg == TWL6040_REG_VIBCTLL || reg == TWL6040_REG_VIBCTLR) | ||
82 | twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)] = val; | ||
83 | 74 | ||
84 | return ret; | 75 | return ret; |
85 | } | 76 | } |
@@ -456,9 +447,20 @@ EXPORT_SYMBOL(twl6040_get_sysclk); | |||
456 | /* Get the combined status of the vibra control register */ | 447 | /* Get the combined status of the vibra control register */ |
457 | int twl6040_get_vibralr_status(struct twl6040 *twl6040) | 448 | int twl6040_get_vibralr_status(struct twl6040 *twl6040) |
458 | { | 449 | { |
450 | unsigned int reg; | ||
451 | int ret; | ||
459 | u8 status; | 452 | u8 status; |
460 | 453 | ||
461 | status = twl6040->vibra_ctrl_cache[0] | twl6040->vibra_ctrl_cache[1]; | 454 | ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLL, ®); |
455 | if (ret != 0) | ||
456 | return ret; | ||
457 | status = reg; | ||
458 | |||
459 | ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLR, ®); | ||
460 | if (ret != 0) | ||
461 | return ret; | ||
462 | status |= reg; | ||
463 | |||
462 | status &= (TWL6040_VIBENA | TWL6040_VIBSEL); | 464 | status &= (TWL6040_VIBENA | TWL6040_VIBSEL); |
463 | 465 | ||
464 | return status; | 466 | return status; |
@@ -485,12 +487,27 @@ static bool twl6040_readable_reg(struct device *dev, unsigned int reg) | |||
485 | return true; | 487 | return true; |
486 | } | 488 | } |
487 | 489 | ||
490 | static bool twl6040_volatile_reg(struct device *dev, unsigned int reg) | ||
491 | { | ||
492 | switch (reg) { | ||
493 | case TWL6040_REG_VIBCTLL: | ||
494 | case TWL6040_REG_VIBCTLR: | ||
495 | case TWL6040_REG_INTMR: | ||
496 | return false; | ||
497 | default: | ||
498 | return true; | ||
499 | } | ||
500 | } | ||
501 | |||
488 | static struct regmap_config twl6040_regmap_config = { | 502 | static struct regmap_config twl6040_regmap_config = { |
489 | .reg_bits = 8, | 503 | .reg_bits = 8, |
490 | .val_bits = 8, | 504 | .val_bits = 8, |
491 | .max_register = TWL6040_REG_STATUS, /* 0x2e */ | 505 | .max_register = TWL6040_REG_STATUS, /* 0x2e */ |
492 | 506 | ||
493 | .readable_reg = twl6040_readable_reg, | 507 | .readable_reg = twl6040_readable_reg, |
508 | .volatile_reg = twl6040_volatile_reg, | ||
509 | |||
510 | .cache_type = REGCACHE_RBTREE, | ||
494 | }; | 511 | }; |
495 | 512 | ||
496 | static const struct regmap_irq twl6040_irqs[] = { | 513 | static const struct regmap_irq twl6040_irqs[] = { |
diff --git a/include/linux/mfd/davinci_voicecodec.h b/include/linux/mfd/davinci_voicecodec.h index 13a1ee95a233..5166935ce66d 100644 --- a/include/linux/mfd/davinci_voicecodec.h +++ b/include/linux/mfd/davinci_voicecodec.h | |||
@@ -30,6 +30,8 @@ | |||
30 | 30 | ||
31 | #include <mach/hardware.h> | 31 | #include <mach/hardware.h> |
32 | 32 | ||
33 | struct regmap; | ||
34 | |||
33 | /* | 35 | /* |
34 | * Register values. | 36 | * Register values. |
35 | */ | 37 | */ |
@@ -113,6 +115,7 @@ struct davinci_vc { | |||
113 | 115 | ||
114 | /* Memory resources */ | 116 | /* Memory resources */ |
115 | void __iomem *base; | 117 | void __iomem *base; |
118 | struct regmap *regmap; | ||
116 | 119 | ||
117 | /* MFD cells */ | 120 | /* MFD cells */ |
118 | struct mfd_cell cells[DAVINCI_VC_CELLS]; | 121 | struct mfd_cell cells[DAVINCI_VC_CELLS]; |
diff --git a/include/linux/mfd/twl6040.h b/include/linux/mfd/twl6040.h index 6dd8893b2a56..81f639bc1ae6 100644 --- a/include/linux/mfd/twl6040.h +++ b/include/linux/mfd/twl6040.h | |||
@@ -230,7 +230,6 @@ struct twl6040 { | |||
230 | int audpwron; | 230 | int audpwron; |
231 | int power_count; | 231 | int power_count; |
232 | int rev; | 232 | int rev; |
233 | u8 vibra_ctrl_cache[2]; | ||
234 | 233 | ||
235 | /* PLL configuration */ | 234 | /* PLL configuration */ |
236 | int pll; | 235 | int pll; |