Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: Convert wm8350 physical I/O to regmap API

The driver still uses a custom cache implementation but the underlying
physical I/O is now done using the regmap API, saving some code and
avoiding allocating enormous scratch arrays on the stack.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

authored by

Mark Brown and committed by
Samuel Ortiz
b7b142d9 ce7e4e11

+27 -66
+10 -21
drivers/mfd/wm8350-core.c
··· 20 20 #include <linux/device.h> 21 21 #include <linux/delay.h> 22 22 #include <linux/interrupt.h> 23 + #include <linux/regmap.h> 23 24 #include <linux/workqueue.h> 24 25 25 26 #include <linux/mfd/wm8350/core.h> ··· 75 74 int bytes = num_regs * 2; 76 75 77 76 dev_dbg(wm8350->dev, "volatile read\n"); 78 - ret = wm8350->read_dev(wm8350, reg, bytes, (char *)dest); 77 + ret = regmap_raw_read(wm8350->regmap, reg, dest, bytes); 79 78 80 79 for (i = reg; i < reg + num_regs; i++) { 81 80 /* Cache is CPU endian */ ··· 96 95 int end = reg + num_regs; 97 96 int ret = 0; 98 97 int bytes = num_regs * 2; 99 - 100 - if (wm8350->read_dev == NULL) 101 - return -ENODEV; 102 98 103 99 if ((reg + num_regs - 1) > WM8350_MAX_REGISTER) { 104 100 dev_err(wm8350->dev, "invalid reg %x\n", ··· 147 149 int end = reg + num_regs; 148 150 int bytes = num_regs * 2; 149 151 150 - if (wm8350->write_dev == NULL) 151 - return -ENODEV; 152 - 153 152 if ((reg + num_regs - 1) > WM8350_MAX_REGISTER) { 154 153 dev_err(wm8350->dev, "invalid reg %x\n", 155 154 reg + num_regs - 1); ··· 177 182 } 178 183 179 184 /* Actually write it out */ 180 - return wm8350->write_dev(wm8350, reg, bytes, (char *)src); 185 + return regmap_raw_write(wm8350->regmap, reg, src, bytes); 181 186 } 182 187 183 188 /* ··· 510 515 * a PMIC so the device many not be in a virgin state and we 511 516 * can't rely on the silicon values. 512 517 */ 513 - ret = wm8350->read_dev(wm8350, 0, 514 - sizeof(u16) * (WM8350_MAX_REGISTER + 1), 515 - wm8350->reg_cache); 518 + ret = regmap_raw_read(wm8350->regmap, 0, wm8350->reg_cache, 519 + sizeof(u16) * (WM8350_MAX_REGISTER + 1)); 516 520 if (ret < 0) { 517 521 dev_err(wm8350->dev, 518 522 "failed to read initial cache values\n"); ··· 564 570 struct wm8350_platform_data *pdata) 565 571 { 566 572 int ret; 567 - u16 id1, id2, mask_rev; 568 - u16 cust_id, mode, chip_rev; 573 + unsigned int id1, id2, mask_rev; 574 + unsigned int cust_id, mode, chip_rev; 569 575 570 576 dev_set_drvdata(wm8350->dev, wm8350); 571 577 572 578 /* get WM8350 revision and config mode */ 573 - ret = wm8350->read_dev(wm8350, WM8350_RESET_ID, sizeof(id1), &id1); 579 + ret = regmap_read(wm8350->regmap, WM8350_RESET_ID, &id1); 574 580 if (ret != 0) { 575 581 dev_err(wm8350->dev, "Failed to read ID: %d\n", ret); 576 582 goto err; 577 583 } 578 584 579 - ret = wm8350->read_dev(wm8350, WM8350_ID, sizeof(id2), &id2); 585 + ret = regmap_read(wm8350->regmap, WM8350_ID, &id2); 580 586 if (ret != 0) { 581 587 dev_err(wm8350->dev, "Failed to read ID: %d\n", ret); 582 588 goto err; 583 589 } 584 590 585 - ret = wm8350->read_dev(wm8350, WM8350_REVISION, sizeof(mask_rev), 586 - &mask_rev); 591 + ret = regmap_read(wm8350->regmap, WM8350_REVISION, &mask_rev); 587 592 if (ret != 0) { 588 593 dev_err(wm8350->dev, "Failed to read revision: %d\n", ret); 589 594 goto err; 590 595 } 591 - 592 - id1 = be16_to_cpu(id1); 593 - id2 = be16_to_cpu(id2); 594 - mask_rev = be16_to_cpu(mask_rev); 595 596 596 597 if (id1 != 0x6143) { 597 598 dev_err(wm8350->dev,
+15 -38
drivers/mfd/wm8350-i2c.c
··· 15 15 16 16 #include <linux/module.h> 17 17 #include <linux/moduleparam.h> 18 + #include <linux/err.h> 18 19 #include <linux/init.h> 19 20 #include <linux/i2c.h> 20 21 #include <linux/platform_device.h> 21 22 #include <linux/mfd/wm8350/core.h> 23 + #include <linux/regmap.h> 22 24 #include <linux/slab.h> 23 25 24 - static int wm8350_i2c_read_device(struct wm8350 *wm8350, char reg, 25 - int bytes, void *dest) 26 - { 27 - int ret; 28 - 29 - ret = i2c_master_send(wm8350->i2c_client, &reg, 1); 30 - if (ret < 0) 31 - return ret; 32 - ret = i2c_master_recv(wm8350->i2c_client, dest, bytes); 33 - if (ret < 0) 34 - return ret; 35 - if (ret != bytes) 36 - return -EIO; 37 - return 0; 38 - } 39 - 40 - static int wm8350_i2c_write_device(struct wm8350 *wm8350, char reg, 41 - int bytes, void *src) 42 - { 43 - /* we add 1 byte for device register */ 44 - u8 msg[(WM8350_MAX_REGISTER << 1) + 1]; 45 - int ret; 46 - 47 - if (bytes > ((WM8350_MAX_REGISTER << 1) + 1)) 48 - return -EINVAL; 49 - 50 - msg[0] = reg; 51 - memcpy(&msg[1], src, bytes); 52 - ret = i2c_master_send(wm8350->i2c_client, msg, bytes + 1); 53 - if (ret < 0) 54 - return ret; 55 - if (ret != bytes + 1) 56 - return -EIO; 57 - return 0; 58 - } 26 + static const struct regmap_config wm8350_regmap = { 27 + .reg_bits = 8, 28 + .val_bits = 16, 29 + }; 59 30 60 31 static int wm8350_i2c_probe(struct i2c_client *i2c, 61 32 const struct i2c_device_id *id) ··· 38 67 if (wm8350 == NULL) 39 68 return -ENOMEM; 40 69 70 + wm8350->regmap = devm_regmap_init_i2c(i2c, &wm8350_regmap); 71 + if (IS_ERR(wm8350->regmap)) { 72 + ret = PTR_ERR(wm8350->regmap); 73 + dev_err(&i2c->dev, "Failed to allocate register map: %d\n", 74 + ret); 75 + return ret; 76 + } 77 + 41 78 i2c_set_clientdata(i2c, wm8350); 42 79 wm8350->dev = &i2c->dev; 43 - wm8350->i2c_client = i2c; 44 - wm8350->read_dev = wm8350_i2c_read_device; 45 - wm8350->write_dev = wm8350_i2c_write_device; 46 80 47 81 ret = wm8350_device_init(wm8350, i2c->irq, i2c->dev.platform_data); 48 82 if (ret < 0) ··· 56 80 return ret; 57 81 58 82 err: 83 + regmap_exit(wm8350->regmap); 59 84 return ret; 60 85 } 61 86
+2 -7
include/linux/mfd/wm8350/core.h
··· 602 602 extern const u16 wm8352_mode3_defaults[]; 603 603 604 604 struct wm8350; 605 + struct regmap; 605 606 606 607 struct wm8350_hwmon { 607 608 struct platform_device *pdev; ··· 613 612 struct device *dev; 614 613 615 614 /* device IO */ 616 - union { 617 - struct i2c_client *i2c_client; 618 - struct spi_device *spi_device; 619 - }; 620 - int (*read_dev)(struct wm8350 *wm8350, char reg, int size, void *dest); 621 - int (*write_dev)(struct wm8350 *wm8350, char reg, int size, 622 - void *src); 615 + struct regmap *regmap; 623 616 u16 *reg_cache; 624 617 625 618 struct mutex auxadc_mutex;