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

[media] tda18212: convert to RegMap API

Use RegMap API to handle all the boring I2C register access
boilerplate stuff.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
3b60b761 e4a42e18

+18 -114
+1
drivers/media/tuners/Kconfig
··· 204 204 config MEDIA_TUNER_TDA18212 205 205 tristate "NXP TDA18212 silicon tuner" 206 206 depends on MEDIA_SUPPORT && I2C 207 + select REGMAP_I2C 207 208 default m if !MEDIA_SUBDRV_AUTOSELECT 208 209 help 209 210 NXP TDA18212 silicon tuner driver.
+17 -114
drivers/media/tuners/tda18212.c
··· 19 19 */ 20 20 21 21 #include "tda18212.h" 22 - 23 - /* Max transfer size done by I2C transfer functions */ 24 - #define MAX_XFER_SIZE 64 22 + #include <linux/regmap.h> 25 23 26 24 struct tda18212_dev { 27 25 struct tda18212_config cfg; 28 26 struct i2c_client *client; 27 + struct regmap *regmap; 29 28 30 29 u32 if_frequency; 31 30 }; 32 - 33 - /* write multiple registers */ 34 - static int tda18212_wr_regs(struct tda18212_dev *dev, u8 reg, u8 *val, int len) 35 - { 36 - int ret; 37 - u8 buf[MAX_XFER_SIZE]; 38 - struct i2c_msg msg[1] = { 39 - { 40 - .addr = dev->client->addr, 41 - .flags = 0, 42 - .len = 1 + len, 43 - .buf = buf, 44 - } 45 - }; 46 - 47 - if (1 + len > sizeof(buf)) { 48 - dev_warn(&dev->client->dev, 49 - "i2c wr reg=%04x: len=%d is too big!\n", 50 - reg, len); 51 - return -EINVAL; 52 - } 53 - 54 - buf[0] = reg; 55 - memcpy(&buf[1], val, len); 56 - 57 - ret = i2c_transfer(dev->client->adapter, msg, 1); 58 - if (ret == 1) { 59 - ret = 0; 60 - } else { 61 - dev_warn(&dev->client->dev, 62 - "i2c wr failed=%d reg=%02x len=%d\n", 63 - ret, reg, len); 64 - ret = -EREMOTEIO; 65 - } 66 - return ret; 67 - } 68 - 69 - /* read multiple registers */ 70 - static int tda18212_rd_regs(struct tda18212_dev *dev, u8 reg, u8 *val, int len) 71 - { 72 - int ret; 73 - u8 buf[MAX_XFER_SIZE]; 74 - struct i2c_msg msg[2] = { 75 - { 76 - .addr = dev->client->addr, 77 - .flags = 0, 78 - .len = 1, 79 - .buf = &reg, 80 - }, { 81 - .addr = dev->client->addr, 82 - .flags = I2C_M_RD, 83 - .len = len, 84 - .buf = buf, 85 - } 86 - }; 87 - 88 - if (len > sizeof(buf)) { 89 - dev_warn(&dev->client->dev, 90 - "i2c rd reg=%04x: len=%d is too big!\n", 91 - reg, len); 92 - return -EINVAL; 93 - } 94 - 95 - ret = i2c_transfer(dev->client->adapter, msg, 2); 96 - if (ret == 2) { 97 - memcpy(val, buf, len); 98 - ret = 0; 99 - } else { 100 - dev_warn(&dev->client->dev, 101 - "i2c rd failed=%d reg=%02x len=%d\n", 102 - ret, reg, len); 103 - ret = -EREMOTEIO; 104 - } 105 - 106 - return ret; 107 - } 108 - 109 - /* write single register */ 110 - static int tda18212_wr_reg(struct tda18212_dev *dev, u8 reg, u8 val) 111 - { 112 - return tda18212_wr_regs(dev, reg, &val, 1); 113 - } 114 - 115 - /* read single register */ 116 - static int tda18212_rd_reg(struct tda18212_dev *dev, u8 reg, u8 *val) 117 - { 118 - return tda18212_rd_regs(dev, reg, val, 1); 119 - } 120 - 121 - #if 0 /* keep, useful when developing driver */ 122 - static void tda18212_dump_regs(struct tda18212_dev *dev) 123 - { 124 - int i; 125 - u8 buf[256]; 126 - 127 - #define TDA18212_RD_LEN 32 128 - for (i = 0; i < sizeof(buf); i += TDA18212_RD_LEN) 129 - tda18212_rd_regs(dev, i, &buf[i], TDA18212_RD_LEN); 130 - 131 - print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 32, 1, buf, 132 - sizeof(buf), true); 133 - 134 - return; 135 - } 136 - #endif 137 31 138 32 static int tda18212_set_params(struct dvb_frontend *fe) 139 33 { ··· 125 231 goto error; 126 232 } 127 233 128 - ret = tda18212_wr_reg(dev, 0x23, bw_params[i][2]); 234 + ret = regmap_write(dev->regmap, 0x23, bw_params[i][2]); 129 235 if (ret) 130 236 goto error; 131 237 132 - ret = tda18212_wr_reg(dev, 0x06, 0x00); 238 + ret = regmap_write(dev->regmap, 0x06, 0x00); 133 239 if (ret) 134 240 goto error; 135 241 136 - ret = tda18212_wr_reg(dev, 0x0f, bw_params[i][0]); 242 + ret = regmap_write(dev->regmap, 0x0f, bw_params[i][0]); 137 243 if (ret) 138 244 goto error; 139 245 ··· 146 252 buf[6] = ((c->frequency / 1000) >> 0) & 0xff; 147 253 buf[7] = 0xc1; 148 254 buf[8] = 0x01; 149 - ret = tda18212_wr_regs(dev, 0x12, buf, sizeof(buf)); 255 + ret = regmap_bulk_write(dev->regmap, 0x12, buf, sizeof(buf)); 150 256 if (ret) 151 257 goto error; 152 258 ··· 193 299 struct dvb_frontend *fe = cfg->fe; 194 300 struct tda18212_dev *dev; 195 301 int ret; 196 - u8 chip_id = chip_id; 302 + unsigned int chip_id; 197 303 char *version; 304 + static const struct regmap_config regmap_config = { 305 + .reg_bits = 8, 306 + .val_bits = 8, 307 + }; 198 308 199 309 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 200 310 if (dev == NULL) { ··· 209 311 210 312 memcpy(&dev->cfg, cfg, sizeof(struct tda18212_config)); 211 313 dev->client = client; 314 + dev->regmap = devm_regmap_init_i2c(client, &regmap_config); 315 + if (IS_ERR(dev->regmap)) { 316 + ret = PTR_ERR(dev->regmap); 317 + goto err; 318 + } 212 319 213 320 /* check if the tuner is there */ 214 321 if (fe->ops.i2c_gate_ctrl) 215 322 fe->ops.i2c_gate_ctrl(fe, 1); /* open I2C-gate */ 216 323 217 - ret = tda18212_rd_reg(dev, 0x00, &chip_id); 324 + ret = regmap_read(dev->regmap, 0x00, &chip_id); 218 325 dev_dbg(&dev->client->dev, "chip_id=%02x\n", chip_id); 219 326 220 327 if (fe->ops.i2c_gate_ctrl)