bd9571mwv.c (1e40a92c651f4bb383df757b69821f74820b6e6a) bd9571mwv.c (f16e1fd197f85a943b5880009f4aefe05a17df0d)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * ROHM BD9571MWV-M MFD driver
4 *
5 * Copyright (C) 2017 Marek Vasut <marek.vasut+renesas@gmail.com>
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * ROHM BD9571MWV-M MFD driver
4 *
5 * Copyright (C) 2017 Marek Vasut <marek.vasut+renesas@gmail.com>
6 * Copyright (C) 2020 Renesas Electronics Corporation
6 *
7 * Based on the TPS65086 driver
8 */
9
10#include <linux/i2c.h>
11#include <linux/interrupt.h>
12#include <linux/mfd/core.h>
13#include <linux/module.h>

--- 83 unchanged lines hidden (view full) ---

97 .mask_base = BD9571MWV_INT_INTMASK,
98 .ack_base = BD9571MWV_INT_INTREQ,
99 .init_ack_masked = true,
100 .num_regs = 1,
101 .irqs = bd9571mwv_irqs,
102 .num_irqs = ARRAY_SIZE(bd9571mwv_irqs),
103};
104
7 *
8 * Based on the TPS65086 driver
9 */
10
11#include <linux/i2c.h>
12#include <linux/interrupt.h>
13#include <linux/mfd/core.h>
14#include <linux/module.h>

--- 83 unchanged lines hidden (view full) ---

98 .mask_base = BD9571MWV_INT_INTMASK,
99 .ack_base = BD9571MWV_INT_INTREQ,
100 .init_ack_masked = true,
101 .num_regs = 1,
102 .irqs = bd9571mwv_irqs,
103 .num_irqs = ARRAY_SIZE(bd9571mwv_irqs),
104};
105
105static int bd9571mwv_identify(struct bd9571mwv *bd)
106static int bd957x_identify(struct device *dev, struct regmap *regmap)
106{
107{
107 struct device *dev = bd->dev;
108 unsigned int value;
109 int ret;
110
108 unsigned int value;
109 int ret;
110
111 ret = regmap_read(bd->regmap, BD9571MWV_VENDOR_CODE, &value);
111 ret = regmap_read(regmap, BD9571MWV_VENDOR_CODE, &value);
112 if (ret) {
113 dev_err(dev, "Failed to read vendor code register (ret=%i)\n",
114 ret);
115 return ret;
116 }
117
118 if (value != BD9571MWV_VENDOR_CODE_VAL) {
119 dev_err(dev, "Invalid vendor code ID %02x (expected %02x)\n",
120 value, BD9571MWV_VENDOR_CODE_VAL);
121 return -EINVAL;
122 }
123
112 if (ret) {
113 dev_err(dev, "Failed to read vendor code register (ret=%i)\n",
114 ret);
115 return ret;
116 }
117
118 if (value != BD9571MWV_VENDOR_CODE_VAL) {
119 dev_err(dev, "Invalid vendor code ID %02x (expected %02x)\n",
120 value, BD9571MWV_VENDOR_CODE_VAL);
121 return -EINVAL;
122 }
123
124 ret = regmap_read(bd->regmap, BD9571MWV_PRODUCT_CODE, &value);
124 ret = regmap_read(regmap, BD9571MWV_PRODUCT_CODE, &value);
125 if (ret) {
126 dev_err(dev, "Failed to read product code register (ret=%i)\n",
127 ret);
128 return ret;
129 }
125 if (ret) {
126 dev_err(dev, "Failed to read product code register (ret=%i)\n",
127 ret);
128 return ret;
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 if (ret) {
139 dev_err(dev, "Failed to read revision register (ret=%i)\n",
140 ret);
141 return ret;
142 }
143
131 if (ret) {
132 dev_err(dev, "Failed to read revision register (ret=%i)\n",
133 ret);
134 return ret;
135 }
136
144 dev_info(dev, "Device: BD9571MWV rev. %d\n", value & 0xff);
145
146 return 0;
147}
148
149static int bd9571mwv_probe(struct i2c_client *client,
137 return 0;
138}
139
140static 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;
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;
156 }
158
157
159 i2c_set_clientdata(client, bd);
160 bd->dev = &client->dev;
161 bd->irq = client->irq;
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 }
162
169
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);
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);
167 }
168
174 }
175
169 ret = bd9571mwv_identify(bd);
176 ret = bd957x_identify(dev, regmap);
170 if (ret)
171 return ret;
172
177 if (ret)
178 return ret;
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 if (ret) {
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 return ret;
179 }
180
184 return ret;
185 }
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}
185
186static const struct of_device_id bd9571mwv_of_match_table[] = {
187 { .compatible = "rohm,bd9571mwv", },
188 { /* sentinel */ }
189};
190MODULE_DEVICE_TABLE(of, bd9571mwv_of_match_table);
191

--- 19 unchanged lines hidden ---
189}
190
191static const struct of_device_id bd9571mwv_of_match_table[] = {
192 { .compatible = "rohm,bd9571mwv", },
193 { /* sentinel */ }
194};
195MODULE_DEVICE_TABLE(of, bd9571mwv_of_match_table);
196

--- 19 unchanged lines hidden ---