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

mfd: bd9571mwv: Make the driver more generic

Since the driver supports BD9571MWV PMIC only, this patch makes
the functions and data structure become more generic so that
it can support other PMIC variants as well. Also remove printing
part name which Lee Jones suggested.

Signed-off-by: Khiem Nguyen <khiem.nguyen.xt@renesas.com>
Co-developed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Reviewed-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Khiem Nguyen and committed by
Lee Jones
f16e1fd1 1e40a92c

+44 -53
+42 -37
drivers/mfd/bd9571mwv.c
··· 3 3 * ROHM BD9571MWV-M MFD driver 4 4 * 5 5 * Copyright (C) 2017 Marek Vasut <marek.vasut+renesas@gmail.com> 6 + * Copyright (C) 2020 Renesas Electronics Corporation 6 7 * 7 8 * Based on the TPS65086 driver 8 9 */ ··· 103 102 .num_irqs = ARRAY_SIZE(bd9571mwv_irqs), 104 103 }; 105 104 106 - static int bd9571mwv_identify(struct bd9571mwv *bd) 105 + static int bd957x_identify(struct device *dev, struct regmap *regmap) 107 106 { 108 - struct device *dev = bd->dev; 109 107 unsigned int value; 110 108 int ret; 111 109 112 - ret = regmap_read(bd->regmap, BD9571MWV_VENDOR_CODE, &value); 110 + ret = regmap_read(regmap, BD9571MWV_VENDOR_CODE, &value); 113 111 if (ret) { 114 112 dev_err(dev, "Failed to read vendor code register (ret=%i)\n", 115 113 ret); ··· 121 121 return -EINVAL; 122 122 } 123 123 124 - ret = regmap_read(bd->regmap, BD9571MWV_PRODUCT_CODE, &value); 124 + ret = regmap_read(regmap, BD9571MWV_PRODUCT_CODE, &value); 125 125 if (ret) { 126 126 dev_err(dev, "Failed to read product code register (ret=%i)\n", 127 127 ret); 128 128 return ret; 129 129 } 130 - 131 - if (value != BD9571MWV_PRODUCT_CODE_VAL) { 132 - dev_err(dev, "Invalid product code ID %02x (expected %02x)\n", 133 - value, BD9571MWV_PRODUCT_CODE_VAL); 134 - return -EINVAL; 135 - } 136 - 137 - ret = regmap_read(bd->regmap, BD9571MWV_PRODUCT_REVISION, &value); 130 + ret = regmap_read(regmap, BD9571MWV_PRODUCT_REVISION, &value); 138 131 if (ret) { 139 132 dev_err(dev, "Failed to read revision register (ret=%i)\n", 140 133 ret); 141 134 return ret; 142 135 } 143 136 144 - dev_info(dev, "Device: BD9571MWV rev. %d\n", value & 0xff); 145 - 146 137 return 0; 147 138 } 148 139 149 140 static int bd9571mwv_probe(struct i2c_client *client, 150 - const struct i2c_device_id *ids) 141 + const struct i2c_device_id *ids) 151 142 { 152 - struct bd9571mwv *bd; 153 - int ret; 143 + const struct regmap_config *regmap_config; 144 + const struct regmap_irq_chip *irq_chip; 145 + const struct mfd_cell *cells; 146 + struct device *dev = &client->dev; 147 + struct regmap *regmap; 148 + struct regmap_irq_chip_data *irq_data; 149 + int ret, num_cells, irq = client->irq; 154 150 155 - bd = devm_kzalloc(&client->dev, sizeof(*bd), GFP_KERNEL); 156 - if (!bd) 157 - return -ENOMEM; 158 - 159 - i2c_set_clientdata(client, bd); 160 - bd->dev = &client->dev; 161 - bd->irq = client->irq; 162 - 163 - bd->regmap = devm_regmap_init_i2c(client, &bd9571mwv_regmap_config); 164 - if (IS_ERR(bd->regmap)) { 165 - dev_err(bd->dev, "Failed to initialize register map\n"); 166 - return PTR_ERR(bd->regmap); 151 + /* Read the PMIC product code */ 152 + ret = i2c_smbus_read_byte_data(client, BD9571MWV_PRODUCT_CODE); 153 + if (ret < 0) { 154 + dev_err(dev, "Failed to read product code\n"); 155 + return ret; 167 156 } 168 157 169 - ret = bd9571mwv_identify(bd); 158 + switch (ret) { 159 + case BD9571MWV_PRODUCT_CODE_BD9571MWV: 160 + regmap_config = &bd9571mwv_regmap_config; 161 + irq_chip = &bd9571mwv_irq_chip; 162 + cells = bd9571mwv_cells; 163 + num_cells = ARRAY_SIZE(bd9571mwv_cells); 164 + break; 165 + default: 166 + dev_err(dev, "Unsupported device 0x%x\n", ret); 167 + return -ENODEV; 168 + } 169 + 170 + regmap = devm_regmap_init_i2c(client, regmap_config); 171 + if (IS_ERR(regmap)) { 172 + dev_err(dev, "Failed to initialize register map\n"); 173 + return PTR_ERR(regmap); 174 + } 175 + 176 + ret = bd957x_identify(dev, regmap); 170 177 if (ret) 171 178 return ret; 172 179 173 - ret = devm_regmap_add_irq_chip(bd->dev, bd->regmap, bd->irq, 174 - IRQF_ONESHOT, 0, &bd9571mwv_irq_chip, 175 - &bd->irq_data); 180 + ret = devm_regmap_add_irq_chip(dev, regmap, irq, IRQF_ONESHOT, 0, 181 + irq_chip, &irq_data); 176 182 if (ret) { 177 - dev_err(bd->dev, "Failed to register IRQ chip\n"); 183 + dev_err(dev, "Failed to register IRQ chip\n"); 178 184 return ret; 179 185 } 180 186 181 - return devm_mfd_add_devices(bd->dev, PLATFORM_DEVID_AUTO, 182 - bd9571mwv_cells, ARRAY_SIZE(bd9571mwv_cells), 183 - NULL, 0, regmap_irq_get_domain(bd->irq_data)); 187 + return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, cells, num_cells, 188 + NULL, 0, regmap_irq_get_domain(irq_data)); 184 189 } 185 190 186 191 static const struct of_device_id bd9571mwv_of_match_table[] = {
+2 -16
include/linux/mfd/bd9571mwv.h
··· 3 3 * ROHM BD9571MWV-M driver 4 4 * 5 5 * Copyright (C) 2017 Marek Vasut <marek.vasut+renesas@gmail.com> 6 + * Copyright (C) 2020 Renesas Electronics Corporation 6 7 * 7 8 * Based on the TPS65086 driver 8 9 */ ··· 18 17 #define BD9571MWV_VENDOR_CODE 0x00 19 18 #define BD9571MWV_VENDOR_CODE_VAL 0xdb 20 19 #define BD9571MWV_PRODUCT_CODE 0x01 21 - #define BD9571MWV_PRODUCT_CODE_VAL 0x60 20 + #define BD9571MWV_PRODUCT_CODE_BD9571MWV 0x60 22 21 #define BD9571MWV_PRODUCT_REVISION 0x02 23 22 24 23 #define BD9571MWV_I2C_FUSA_MODE 0x10 ··· 95 94 BD9571MWV_IRQ_WDT_OF, 96 95 BD9571MWV_IRQ_BKUP_TRG, 97 96 }; 98 - 99 - /** 100 - * struct bd9571mwv - state holder for the bd9571mwv driver 101 - * 102 - * Device data may be used to access the BD9571MWV chip 103 - */ 104 - struct bd9571mwv { 105 - struct device *dev; 106 - struct regmap *regmap; 107 - 108 - /* IRQ Data */ 109 - int irq; 110 - struct regmap_irq_chip_data *irq_data; 111 - }; 112 - 113 97 #endif /* __LINUX_MFD_BD9571MWV_H */