diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2016-02-03 12:22:03 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2016-02-05 14:32:16 +0100 |
commit | 77bfff1cbef2db1b8024dbb4fd2e5bdaeff5b9f0 (patch) | |
tree | a599b19a73e77e04a12b91339ea6d717023b1aaa /drivers/mfd | |
parent | 7a53e162de2a5a7c44e654f09264d5c3758768bf (diff) | |
download | barebox-77bfff1cbef2db1b8024dbb4fd2e5bdaeff5b9f0.tar.gz barebox-77bfff1cbef2db1b8024dbb4fd2e5bdaeff5b9f0.tar.xz |
mfd: mc13xxx: Switch to regmap support
This moves the mc13xxx driver over to regmap.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/mc13xxx.c | 127 |
1 files changed, 56 insertions, 71 deletions
diff --git a/drivers/mfd/mc13xxx.c b/drivers/mfd/mc13xxx.c index 0ebfc9e153..68d70c53d5 100644 --- a/drivers/mfd/mc13xxx.c +++ b/drivers/mfd/mc13xxx.c @@ -22,6 +22,7 @@ #include <errno.h> #include <malloc.h> #include <of.h> +#include <regmap.h> #include <i2c/i2c.h> #include <spi/spi.h> @@ -29,15 +30,16 @@ #define DRIVERNAME "mc13xxx" +#define MC13XXX_NUMREGS 0x3f + struct mc13xxx { - struct cdev cdev; + struct device_d *dev; + struct regmap *map; union { struct i2c_client *client; struct spi_device *spi; }; int revision; - int (*reg_read)(struct mc13xxx*, u8, u32*); - int (*reg_write)(struct mc13xxx*, u8, u32); }; struct mc13xxx_devtype { @@ -100,8 +102,9 @@ static int spi_rw(struct spi_device *spi, void * buf, size_t len) #define MXC_PMIC_REG_NUM(reg) (((reg) & 0x3f) << 25) #define MXC_PMIC_WRITE (1 << 31) -static int mc13xxx_spi_reg_read(struct mc13xxx *mc13xxx, u8 reg, u32 *val) +static int mc13xxx_spi_reg_read(void *ctx, unsigned int reg, unsigned int *val) { + struct mc13xxx *mc13xxx = ctx; uint32_t buf; buf = MXC_PMIC_REG_NUM(reg); @@ -113,8 +116,9 @@ static int mc13xxx_spi_reg_read(struct mc13xxx *mc13xxx, u8 reg, u32 *val) return 0; } -static int mc13xxx_spi_reg_write(struct mc13xxx *mc13xxx, u8 reg, u32 val) +static int mc13xxx_spi_reg_write(void *ctx, unsigned int reg, unsigned int val) { + struct mc13xxx *mc13xxx = ctx; uint32_t buf = MXC_PMIC_REG_NUM(reg) | MXC_PMIC_WRITE | (val & 0xffffff); spi_rw(mc13xxx->spi, &buf, 4); @@ -124,8 +128,9 @@ static int mc13xxx_spi_reg_write(struct mc13xxx *mc13xxx, u8 reg, u32 val) #endif #ifdef CONFIG_I2C -static int mc13xxx_i2c_reg_read(struct mc13xxx *mc13xxx, u8 reg, u32 *val) +static int mc13xxx_i2c_reg_read(void *ctx, unsigned int reg, unsigned int *val) { + struct mc13xxx *mc13xxx = ctx; u8 buf[3]; int ret; @@ -135,8 +140,9 @@ static int mc13xxx_i2c_reg_read(struct mc13xxx *mc13xxx, u8 reg, u32 *val) return ret == 3 ? 0 : ret; } -static int mc13xxx_i2c_reg_write(struct mc13xxx *mc13xxx, u8 reg, u32 val) +static int mc13xxx_i2c_reg_write(void *ctx, unsigned int reg, unsigned int val) { + struct mc13xxx *mc13xxx = ctx; u8 buf[] = { val >> 16, val >> 8, @@ -152,13 +158,13 @@ static int mc13xxx_i2c_reg_write(struct mc13xxx *mc13xxx, u8 reg, u32 val) int mc13xxx_reg_write(struct mc13xxx *mc13xxx, u8 reg, u32 val) { - return mc13xxx->reg_write(mc13xxx, reg, val); + return regmap_write(mc13xxx->map, reg, val); } EXPORT_SYMBOL(mc13xxx_reg_write); int mc13xxx_reg_read(struct mc13xxx *mc13xxx, u8 reg, u32 *val) { - return mc13xxx->reg_read(mc13xxx, reg, val); + return regmap_read(mc13xxx->map, reg, val); } EXPORT_SYMBOL(mc13xxx_reg_read); @@ -177,54 +183,6 @@ int mc13xxx_set_bits(struct mc13xxx *mc13xxx, u8 reg, u32 mask, u32 val) } EXPORT_SYMBOL(mc13xxx_set_bits); -static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags) -{ - struct mc13xxx *mc13xxx = to_mc13xxx(cdev); - u32 *buf = _buf; - size_t i = count >> 2; - int err; - - offset >>= 2; - - while (i) { - err = mc13xxx_reg_read(mc13xxx, offset, buf); - if (err) - return (ssize_t)err; - buf++; - i--; - offset++; - } - - return count; -} - -static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags) -{ - struct mc13xxx *mc13xxx = to_mc13xxx(cdev); - const u32 *buf = _buf; - size_t i = count >> 2; - int err; - - offset >>= 2; - - while (i) { - err = mc13xxx_reg_write(mc13xxx, offset, *buf); - if (err) - return (ssize_t)err; - buf++; - i--; - offset++; - } - - return count; -} - -static struct file_operations mc_fops = { - .lseek = dev_lseek_default, - .read = mc_read, - .write = mc_write, -}; - static int __init mc13783_revision(struct mc13xxx *mc13xxx) { unsigned int rev_id; @@ -245,7 +203,7 @@ static int __init mc13783_revision(struct mc13xxx *mc13xxx) } else sprintf(revstr, "%d.%d", rev / 0x10, rev % 10); - dev_info(mc_dev->cdev.dev, "Found MC13783 ID: 0x%06x [Rev: %s]\n", + dev_info(mc_dev->dev, "Found MC13783 ID: 0x%06x [Rev: %s]\n", rev_id, revstr); return rev; @@ -297,7 +255,7 @@ static int __init mc13892_revision(struct mc13xxx *mc13xxx) } } - dev_info(mc_dev->cdev.dev, "Found MC13892 ID: 0x%06x [Rev: %s]\n", + dev_info(mc_dev->dev, "Found MC13892 ID: 0x%06x [Rev: %s]\n", rev_id, revstr); return rev; @@ -312,11 +270,38 @@ static int __init mc34708_revision(struct mc13xxx *mc13xxx) if (rev_id > 0xfff) return -ENODEV; - dev_info(mc_dev->cdev.dev, "Found MC34708 ID: 0x%03x\n", rev_id); + dev_info(mc_dev->dev, "Found MC34708 ID: 0x%03x\n", rev_id); return (int)rev_id; } +#ifdef CONFIG_SPI +static struct regmap_bus regmap_mc13xxx_spi_bus = { + .reg_write = mc13xxx_spi_reg_write, + .reg_read = mc13xxx_spi_reg_read, +}; + +static const struct regmap_config mc13xxx_regmap_spi_config = { + .reg_bits = 7, + .pad_bits = 1, + .val_bits = 24, + .max_register = MC13XXX_NUMREGS, +}; +#endif + +#ifdef CONFIG_I2C +static struct regmap_bus regmap_mc13xxx_i2c_bus = { + .reg_write = mc13xxx_i2c_reg_write, + .reg_read = mc13xxx_i2c_reg_read, +}; + +static const struct regmap_config mc13xxx_regmap_i2c_config = { + .reg_bits = 8, + .val_bits = 24, + .max_register = MC13XXX_NUMREGS, +}; +#endif + static int __init mc13xxx_probe(struct device_d *dev) { struct mc13xxx_devtype *devtype; @@ -330,13 +315,14 @@ static int __init mc13xxx_probe(struct device_d *dev) return ret; mc_dev = xzalloc(sizeof(*mc_dev)); - mc_dev->cdev.name = DRIVERNAME; + mc_dev->dev = dev; #ifdef CONFIG_I2C if (dev->bus == &i2c_bus) { mc_dev->client = to_i2c_client(dev); - mc_dev->reg_read = mc13xxx_i2c_reg_read; - mc_dev->reg_write = mc13xxx_i2c_reg_write; + + mc_dev->map = regmap_init(dev, ®map_mc13xxx_i2c_bus, + mc_dev, &mc13xxx_regmap_i2c_config); } #endif #ifdef CONFIG_SPI @@ -345,25 +331,24 @@ static int __init mc13xxx_probe(struct device_d *dev) mc_dev->spi->mode = SPI_MODE_0 | SPI_CS_HIGH; mc_dev->spi->bits_per_word = 32; mc_dev->spi->max_speed_hz = 20000000; - mc_dev->reg_read = mc13xxx_spi_reg_read; - mc_dev->reg_write = mc13xxx_spi_reg_write; + mc_dev->map = regmap_init(dev, ®map_mc13xxx_spi_bus, + mc_dev, &mc13xxx_regmap_spi_config); } #endif - mc_dev->cdev.size = 256; - mc_dev->cdev.dev = dev; - mc_dev->cdev.ops = &mc_fops; - rev = devtype->revision(mc_dev); if (rev < 0) { - dev_err(mc_dev->cdev.dev, "No PMIC detected.\n"); + dev_err(mc_dev->dev, "No PMIC detected.\n"); free(mc_dev); mc_dev = NULL; return rev; } mc_dev->revision = rev; - devfs_create(&mc_dev->cdev); + + ret = regmap_register_cdev(mc_dev->map, NULL); + if (ret) + return ret; if (mc13xxx_init_callback) mc13xxx_init_callback(mc_dev); |