Loading drivers/mfd/davinci_voicecodec.c +13 −10 Original line number Diff line number Diff line Loading @@ -27,21 +27,16 @@ #include <linux/delay.h> #include <linux/io.h> #include <linux/clk.h> #include <linux/regmap.h> #include <sound/pcm.h> #include <linux/mfd/davinci_voicecodec.h> u32 davinci_vc_read(struct davinci_vc *davinci_vc, int reg) { return __raw_readl(davinci_vc->base + reg); } void davinci_vc_write(struct davinci_vc *davinci_vc, int reg, u32 val) { __raw_writel(val, davinci_vc->base + reg); } static struct regmap_config davinci_vc_regmap = { .reg_bits = 32, .val_bits = 32, }; static int __init davinci_vc_probe(struct platform_device *pdev) { Loading Loading @@ -74,6 +69,14 @@ static int __init davinci_vc_probe(struct platform_device *pdev) goto fail; } davinci_vc->regmap = devm_regmap_init_mmio(&pdev->dev, davinci_vc->base, &davinci_vc_regmap); if (IS_ERR(davinci_vc->regmap)) { ret = PTR_ERR(davinci_vc->regmap); goto fail; } res = platform_get_resource(pdev, IORESOURCE_DMA, 0); if (!res) { dev_err(&pdev->dev, "no DMA resource\n"); Loading drivers/mfd/twl6040.c +30 −13 Original line number Diff line number Diff line Loading @@ -58,15 +58,9 @@ int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg) int ret; unsigned int val; /* Vibra control registers from cache */ if (unlikely(reg == TWL6040_REG_VIBCTLL || reg == TWL6040_REG_VIBCTLR)) { val = twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)]; } else { ret = regmap_read(twl6040->regmap, reg, &val); if (ret < 0) return ret; } return val; } Loading @@ -77,9 +71,6 @@ int twl6040_reg_write(struct twl6040 *twl6040, unsigned int reg, u8 val) int ret; ret = regmap_write(twl6040->regmap, reg, val); /* Cache the vibra control registers */ if (reg == TWL6040_REG_VIBCTLL || reg == TWL6040_REG_VIBCTLR) twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)] = val; return ret; } Loading Loading @@ -456,9 +447,20 @@ EXPORT_SYMBOL(twl6040_get_sysclk); /* Get the combined status of the vibra control register */ int twl6040_get_vibralr_status(struct twl6040 *twl6040) { unsigned int reg; int ret; u8 status; status = twl6040->vibra_ctrl_cache[0] | twl6040->vibra_ctrl_cache[1]; ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLL, ®); if (ret != 0) return ret; status = reg; ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLR, ®); if (ret != 0) return ret; status |= reg; status &= (TWL6040_VIBENA | TWL6040_VIBSEL); return status; Loading @@ -485,12 +487,27 @@ static bool twl6040_readable_reg(struct device *dev, unsigned int reg) return true; } static bool twl6040_volatile_reg(struct device *dev, unsigned int reg) { switch (reg) { case TWL6040_REG_VIBCTLL: case TWL6040_REG_VIBCTLR: case TWL6040_REG_INTMR: return false; default: return true; } } static struct regmap_config twl6040_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = TWL6040_REG_STATUS, /* 0x2e */ .readable_reg = twl6040_readable_reg, .volatile_reg = twl6040_volatile_reg, .cache_type = REGCACHE_RBTREE, }; static const struct regmap_irq twl6040_irqs[] = { Loading include/linux/mfd/davinci_voicecodec.h +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ #include <mach/hardware.h> struct regmap; /* * Register values. */ Loading Loading @@ -113,6 +115,7 @@ struct davinci_vc { /* Memory resources */ void __iomem *base; struct regmap *regmap; /* MFD cells */ struct mfd_cell cells[DAVINCI_VC_CELLS]; Loading include/linux/mfd/twl6040.h +0 −1 Original line number Diff line number Diff line Loading @@ -230,7 +230,6 @@ struct twl6040 { int audpwron; int power_count; int rev; u8 vibra_ctrl_cache[2]; /* PLL configuration */ int pll; Loading Loading
drivers/mfd/davinci_voicecodec.c +13 −10 Original line number Diff line number Diff line Loading @@ -27,21 +27,16 @@ #include <linux/delay.h> #include <linux/io.h> #include <linux/clk.h> #include <linux/regmap.h> #include <sound/pcm.h> #include <linux/mfd/davinci_voicecodec.h> u32 davinci_vc_read(struct davinci_vc *davinci_vc, int reg) { return __raw_readl(davinci_vc->base + reg); } void davinci_vc_write(struct davinci_vc *davinci_vc, int reg, u32 val) { __raw_writel(val, davinci_vc->base + reg); } static struct regmap_config davinci_vc_regmap = { .reg_bits = 32, .val_bits = 32, }; static int __init davinci_vc_probe(struct platform_device *pdev) { Loading Loading @@ -74,6 +69,14 @@ static int __init davinci_vc_probe(struct platform_device *pdev) goto fail; } davinci_vc->regmap = devm_regmap_init_mmio(&pdev->dev, davinci_vc->base, &davinci_vc_regmap); if (IS_ERR(davinci_vc->regmap)) { ret = PTR_ERR(davinci_vc->regmap); goto fail; } res = platform_get_resource(pdev, IORESOURCE_DMA, 0); if (!res) { dev_err(&pdev->dev, "no DMA resource\n"); Loading
drivers/mfd/twl6040.c +30 −13 Original line number Diff line number Diff line Loading @@ -58,15 +58,9 @@ int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg) int ret; unsigned int val; /* Vibra control registers from cache */ if (unlikely(reg == TWL6040_REG_VIBCTLL || reg == TWL6040_REG_VIBCTLR)) { val = twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)]; } else { ret = regmap_read(twl6040->regmap, reg, &val); if (ret < 0) return ret; } return val; } Loading @@ -77,9 +71,6 @@ int twl6040_reg_write(struct twl6040 *twl6040, unsigned int reg, u8 val) int ret; ret = regmap_write(twl6040->regmap, reg, val); /* Cache the vibra control registers */ if (reg == TWL6040_REG_VIBCTLL || reg == TWL6040_REG_VIBCTLR) twl6040->vibra_ctrl_cache[VIBRACTRL_MEMBER(reg)] = val; return ret; } Loading Loading @@ -456,9 +447,20 @@ EXPORT_SYMBOL(twl6040_get_sysclk); /* Get the combined status of the vibra control register */ int twl6040_get_vibralr_status(struct twl6040 *twl6040) { unsigned int reg; int ret; u8 status; status = twl6040->vibra_ctrl_cache[0] | twl6040->vibra_ctrl_cache[1]; ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLL, ®); if (ret != 0) return ret; status = reg; ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLR, ®); if (ret != 0) return ret; status |= reg; status &= (TWL6040_VIBENA | TWL6040_VIBSEL); return status; Loading @@ -485,12 +487,27 @@ static bool twl6040_readable_reg(struct device *dev, unsigned int reg) return true; } static bool twl6040_volatile_reg(struct device *dev, unsigned int reg) { switch (reg) { case TWL6040_REG_VIBCTLL: case TWL6040_REG_VIBCTLR: case TWL6040_REG_INTMR: return false; default: return true; } } static struct regmap_config twl6040_regmap_config = { .reg_bits = 8, .val_bits = 8, .max_register = TWL6040_REG_STATUS, /* 0x2e */ .readable_reg = twl6040_readable_reg, .volatile_reg = twl6040_volatile_reg, .cache_type = REGCACHE_RBTREE, }; static const struct regmap_irq twl6040_irqs[] = { Loading
include/linux/mfd/davinci_voicecodec.h +3 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ #include <mach/hardware.h> struct regmap; /* * Register values. */ Loading Loading @@ -113,6 +115,7 @@ struct davinci_vc { /* Memory resources */ void __iomem *base; struct regmap *regmap; /* MFD cells */ struct mfd_cell cells[DAVINCI_VC_CELLS]; Loading
include/linux/mfd/twl6040.h +0 −1 Original line number Diff line number Diff line Loading @@ -230,7 +230,6 @@ struct twl6040 { int audpwron; int power_count; int rev; u8 vibra_ctrl_cache[2]; /* PLL configuration */ int pll; Loading