xref: /openbmc/linux/drivers/mfd/bd9571mwv.c (revision b2548da647bb04737196ffd945505d47a166239b)
1bfb26be7SYoshihiro Shimoda // SPDX-License-Identifier: GPL-2.0-only
2d3ea2127SMarek Vasut /*
3*b2548da6SKhiem Nguyen  * ROHM BD9571MWV-M and BD9574MVF-M core driver
4d3ea2127SMarek Vasut  *
5d3ea2127SMarek Vasut  * Copyright (C) 2017 Marek Vasut <marek.vasut+renesas@gmail.com>
6f16e1fd1SKhiem Nguyen  * Copyright (C) 2020 Renesas Electronics Corporation
7d3ea2127SMarek Vasut  *
8d3ea2127SMarek Vasut  * Based on the TPS65086 driver
9d3ea2127SMarek Vasut  */
10d3ea2127SMarek Vasut 
11d3ea2127SMarek Vasut #include <linux/i2c.h>
12d3ea2127SMarek Vasut #include <linux/interrupt.h>
13d3ea2127SMarek Vasut #include <linux/mfd/core.h>
14*b2548da6SKhiem Nguyen #include <linux/mfd/rohm-generic.h>
15d3ea2127SMarek Vasut #include <linux/module.h>
16d3ea2127SMarek Vasut 
17d3ea2127SMarek Vasut #include <linux/mfd/bd9571mwv.h>
18d3ea2127SMarek Vasut 
19d3ea2127SMarek Vasut static const struct mfd_cell bd9571mwv_cells[] = {
20d3ea2127SMarek Vasut 	{ .name = "bd9571mwv-regulator", },
21d3ea2127SMarek Vasut 	{ .name = "bd9571mwv-gpio", },
22d3ea2127SMarek Vasut };
23d3ea2127SMarek Vasut 
24d3ea2127SMarek Vasut static const struct regmap_range bd9571mwv_readable_yes_ranges[] = {
25d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_VENDOR_CODE, BD9571MWV_PRODUCT_REVISION),
267b569bcbSGeert Uytterhoeven 	regmap_reg_range(BD9571MWV_BKUP_MODE_CNT, BD9571MWV_BKUP_MODE_CNT),
27d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_AVS_SET_MONI, BD9571MWV_AVS_DVFS_VID(3)),
28d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_VD18_VID, BD9571MWV_VD33_VID),
29d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_DVFS_VINIT, BD9571MWV_DVFS_VINIT),
30d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_DVFS_SETVMAX, BD9571MWV_DVFS_MONIVDAC),
31d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_GPIO_IN, BD9571MWV_GPIO_IN),
32d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_GPIO_INT, BD9571MWV_GPIO_INTMASK),
33d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTMASK),
34d3ea2127SMarek Vasut };
35d3ea2127SMarek Vasut 
36d3ea2127SMarek Vasut static const struct regmap_access_table bd9571mwv_readable_table = {
37d3ea2127SMarek Vasut 	.yes_ranges	= bd9571mwv_readable_yes_ranges,
38d3ea2127SMarek Vasut 	.n_yes_ranges	= ARRAY_SIZE(bd9571mwv_readable_yes_ranges),
39d3ea2127SMarek Vasut };
40d3ea2127SMarek Vasut 
41d3ea2127SMarek Vasut static const struct regmap_range bd9571mwv_writable_yes_ranges[] = {
427b569bcbSGeert Uytterhoeven 	regmap_reg_range(BD9571MWV_BKUP_MODE_CNT, BD9571MWV_BKUP_MODE_CNT),
43d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_AVS_VD09_VID(0), BD9571MWV_AVS_VD09_VID(3)),
44d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_DVFS_SETVID, BD9571MWV_DVFS_SETVID),
45d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_GPIO_DIR, BD9571MWV_GPIO_OUT),
46d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_GPIO_INT_SET, BD9571MWV_GPIO_INTMASK),
47d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTMASK),
48d3ea2127SMarek Vasut };
49d3ea2127SMarek Vasut 
50d3ea2127SMarek Vasut static const struct regmap_access_table bd9571mwv_writable_table = {
51d3ea2127SMarek Vasut 	.yes_ranges	= bd9571mwv_writable_yes_ranges,
52d3ea2127SMarek Vasut 	.n_yes_ranges	= ARRAY_SIZE(bd9571mwv_writable_yes_ranges),
53d3ea2127SMarek Vasut };
54d3ea2127SMarek Vasut 
55d3ea2127SMarek Vasut static const struct regmap_range bd9571mwv_volatile_yes_ranges[] = {
56b0aff01eSDien Pham 	regmap_reg_range(BD9571MWV_DVFS_MONIVDAC, BD9571MWV_DVFS_MONIVDAC),
57d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_GPIO_IN, BD9571MWV_GPIO_IN),
58d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_GPIO_INT, BD9571MWV_GPIO_INT),
59d3ea2127SMarek Vasut 	regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTREQ),
60d3ea2127SMarek Vasut };
61d3ea2127SMarek Vasut 
62d3ea2127SMarek Vasut static const struct regmap_access_table bd9571mwv_volatile_table = {
63d3ea2127SMarek Vasut 	.yes_ranges	= bd9571mwv_volatile_yes_ranges,
64d3ea2127SMarek Vasut 	.n_yes_ranges	= ARRAY_SIZE(bd9571mwv_volatile_yes_ranges),
65d3ea2127SMarek Vasut };
66d3ea2127SMarek Vasut 
67d3ea2127SMarek Vasut static const struct regmap_config bd9571mwv_regmap_config = {
68d3ea2127SMarek Vasut 	.reg_bits	= 8,
69d3ea2127SMarek Vasut 	.val_bits	= 8,
70d3ea2127SMarek Vasut 	.cache_type	= REGCACHE_RBTREE,
71d3ea2127SMarek Vasut 	.rd_table	= &bd9571mwv_readable_table,
72d3ea2127SMarek Vasut 	.wr_table	= &bd9571mwv_writable_table,
73d3ea2127SMarek Vasut 	.volatile_table	= &bd9571mwv_volatile_table,
74d3ea2127SMarek Vasut 	.max_register	= 0xff,
75d3ea2127SMarek Vasut };
76d3ea2127SMarek Vasut 
77d3ea2127SMarek Vasut static const struct regmap_irq bd9571mwv_irqs[] = {
78d3ea2127SMarek Vasut 	REGMAP_IRQ_REG(BD9571MWV_IRQ_MD1, 0,
79d3ea2127SMarek Vasut 		       BD9571MWV_INT_INTREQ_MD1_INT),
80d3ea2127SMarek Vasut 	REGMAP_IRQ_REG(BD9571MWV_IRQ_MD2_E1, 0,
81d3ea2127SMarek Vasut 		       BD9571MWV_INT_INTREQ_MD2_E1_INT),
82d3ea2127SMarek Vasut 	REGMAP_IRQ_REG(BD9571MWV_IRQ_MD2_E2, 0,
83d3ea2127SMarek Vasut 		       BD9571MWV_INT_INTREQ_MD2_E2_INT),
84d3ea2127SMarek Vasut 	REGMAP_IRQ_REG(BD9571MWV_IRQ_PROT_ERR, 0,
85d3ea2127SMarek Vasut 		       BD9571MWV_INT_INTREQ_PROT_ERR_INT),
86d3ea2127SMarek Vasut 	REGMAP_IRQ_REG(BD9571MWV_IRQ_GP, 0,
87d3ea2127SMarek Vasut 		       BD9571MWV_INT_INTREQ_GP_INT),
88d3ea2127SMarek Vasut 	REGMAP_IRQ_REG(BD9571MWV_IRQ_128H_OF, 0,
89d3ea2127SMarek Vasut 		       BD9571MWV_INT_INTREQ_128H_OF_INT),
90d3ea2127SMarek Vasut 	REGMAP_IRQ_REG(BD9571MWV_IRQ_WDT_OF, 0,
91d3ea2127SMarek Vasut 		       BD9571MWV_INT_INTREQ_WDT_OF_INT),
92d3ea2127SMarek Vasut 	REGMAP_IRQ_REG(BD9571MWV_IRQ_BKUP_TRG, 0,
93d3ea2127SMarek Vasut 		       BD9571MWV_INT_INTREQ_BKUP_TRG_INT),
94d3ea2127SMarek Vasut };
95d3ea2127SMarek Vasut 
96d3ea2127SMarek Vasut static struct regmap_irq_chip bd9571mwv_irq_chip = {
97d3ea2127SMarek Vasut 	.name		= "bd9571mwv",
98d3ea2127SMarek Vasut 	.status_base	= BD9571MWV_INT_INTREQ,
99d3ea2127SMarek Vasut 	.mask_base	= BD9571MWV_INT_INTMASK,
100d3ea2127SMarek Vasut 	.ack_base	= BD9571MWV_INT_INTREQ,
101d3ea2127SMarek Vasut 	.init_ack_masked = true,
102d3ea2127SMarek Vasut 	.num_regs	= 1,
103d3ea2127SMarek Vasut 	.irqs		= bd9571mwv_irqs,
104d3ea2127SMarek Vasut 	.num_irqs	= ARRAY_SIZE(bd9571mwv_irqs),
105d3ea2127SMarek Vasut };
106d3ea2127SMarek Vasut 
107*b2548da6SKhiem Nguyen static const struct mfd_cell bd9574mwf_cells[] = {
108*b2548da6SKhiem Nguyen 	{ .name = "bd9574mwf-regulator", },
109*b2548da6SKhiem Nguyen 	{ .name = "bd9574mwf-gpio", },
110*b2548da6SKhiem Nguyen };
111*b2548da6SKhiem Nguyen 
112*b2548da6SKhiem Nguyen static const struct regmap_range bd9574mwf_readable_yes_ranges[] = {
113*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_VENDOR_CODE, BD9571MWV_PRODUCT_REVISION),
114*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_BKUP_MODE_CNT, BD9571MWV_BKUP_MODE_CNT),
115*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_DVFS_VINIT, BD9571MWV_DVFS_SETVMAX),
116*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_DVFS_SETVID, BD9571MWV_DVFS_MONIVDAC),
117*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_GPIO_IN, BD9571MWV_GPIO_IN),
118*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_GPIO_INT, BD9571MWV_GPIO_INTMASK),
119*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTMASK),
120*b2548da6SKhiem Nguyen };
121*b2548da6SKhiem Nguyen 
122*b2548da6SKhiem Nguyen static const struct regmap_access_table bd9574mwf_readable_table = {
123*b2548da6SKhiem Nguyen 	.yes_ranges	= bd9574mwf_readable_yes_ranges,
124*b2548da6SKhiem Nguyen 	.n_yes_ranges	= ARRAY_SIZE(bd9574mwf_readable_yes_ranges),
125*b2548da6SKhiem Nguyen };
126*b2548da6SKhiem Nguyen 
127*b2548da6SKhiem Nguyen static const struct regmap_range bd9574mwf_writable_yes_ranges[] = {
128*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_BKUP_MODE_CNT, BD9571MWV_BKUP_MODE_CNT),
129*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_DVFS_SETVID, BD9571MWV_DVFS_SETVID),
130*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_GPIO_DIR, BD9571MWV_GPIO_OUT),
131*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_GPIO_INT_SET, BD9571MWV_GPIO_INTMASK),
132*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTMASK),
133*b2548da6SKhiem Nguyen };
134*b2548da6SKhiem Nguyen 
135*b2548da6SKhiem Nguyen static const struct regmap_access_table bd9574mwf_writable_table = {
136*b2548da6SKhiem Nguyen 	.yes_ranges	= bd9574mwf_writable_yes_ranges,
137*b2548da6SKhiem Nguyen 	.n_yes_ranges	= ARRAY_SIZE(bd9574mwf_writable_yes_ranges),
138*b2548da6SKhiem Nguyen };
139*b2548da6SKhiem Nguyen 
140*b2548da6SKhiem Nguyen static const struct regmap_range bd9574mwf_volatile_yes_ranges[] = {
141*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_DVFS_MONIVDAC, BD9571MWV_DVFS_MONIVDAC),
142*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_GPIO_IN, BD9571MWV_GPIO_IN),
143*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_GPIO_INT, BD9571MWV_GPIO_INT),
144*b2548da6SKhiem Nguyen 	regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTREQ),
145*b2548da6SKhiem Nguyen };
146*b2548da6SKhiem Nguyen 
147*b2548da6SKhiem Nguyen static const struct regmap_access_table bd9574mwf_volatile_table = {
148*b2548da6SKhiem Nguyen 	.yes_ranges	= bd9574mwf_volatile_yes_ranges,
149*b2548da6SKhiem Nguyen 	.n_yes_ranges	= ARRAY_SIZE(bd9574mwf_volatile_yes_ranges),
150*b2548da6SKhiem Nguyen };
151*b2548da6SKhiem Nguyen 
152*b2548da6SKhiem Nguyen static const struct regmap_config bd9574mwf_regmap_config = {
153*b2548da6SKhiem Nguyen 	.reg_bits	= 8,
154*b2548da6SKhiem Nguyen 	.val_bits	= 8,
155*b2548da6SKhiem Nguyen 	.cache_type	= REGCACHE_RBTREE,
156*b2548da6SKhiem Nguyen 	.rd_table	= &bd9574mwf_readable_table,
157*b2548da6SKhiem Nguyen 	.wr_table	= &bd9574mwf_writable_table,
158*b2548da6SKhiem Nguyen 	.volatile_table	= &bd9574mwf_volatile_table,
159*b2548da6SKhiem Nguyen 	.max_register	= 0xff,
160*b2548da6SKhiem Nguyen };
161*b2548da6SKhiem Nguyen 
162*b2548da6SKhiem Nguyen static struct regmap_irq_chip bd9574mwf_irq_chip = {
163*b2548da6SKhiem Nguyen 	.name		= "bd9574mwf",
164*b2548da6SKhiem Nguyen 	.status_base	= BD9571MWV_INT_INTREQ,
165*b2548da6SKhiem Nguyen 	.mask_base	= BD9571MWV_INT_INTMASK,
166*b2548da6SKhiem Nguyen 	.ack_base	= BD9571MWV_INT_INTREQ,
167*b2548da6SKhiem Nguyen 	.init_ack_masked = true,
168*b2548da6SKhiem Nguyen 	.num_regs	= 1,
169*b2548da6SKhiem Nguyen 	.irqs		= bd9571mwv_irqs,
170*b2548da6SKhiem Nguyen 	.num_irqs	= ARRAY_SIZE(bd9571mwv_irqs),
171*b2548da6SKhiem Nguyen };
172*b2548da6SKhiem Nguyen 
173f16e1fd1SKhiem Nguyen static int bd957x_identify(struct device *dev, struct regmap *regmap)
174d3ea2127SMarek Vasut {
175d3ea2127SMarek Vasut 	unsigned int value;
176d3ea2127SMarek Vasut 	int ret;
177d3ea2127SMarek Vasut 
178f16e1fd1SKhiem Nguyen 	ret = regmap_read(regmap, BD9571MWV_VENDOR_CODE, &value);
179d3ea2127SMarek Vasut 	if (ret) {
180d3ea2127SMarek Vasut 		dev_err(dev, "Failed to read vendor code register (ret=%i)\n",
181d3ea2127SMarek Vasut 			ret);
182d3ea2127SMarek Vasut 		return ret;
183d3ea2127SMarek Vasut 	}
184d3ea2127SMarek Vasut 
185d3ea2127SMarek Vasut 	if (value != BD9571MWV_VENDOR_CODE_VAL) {
186d3ea2127SMarek Vasut 		dev_err(dev, "Invalid vendor code ID %02x (expected %02x)\n",
187d3ea2127SMarek Vasut 			value, BD9571MWV_VENDOR_CODE_VAL);
188d3ea2127SMarek Vasut 		return -EINVAL;
189d3ea2127SMarek Vasut 	}
190d3ea2127SMarek Vasut 
191f16e1fd1SKhiem Nguyen 	ret = regmap_read(regmap, BD9571MWV_PRODUCT_CODE, &value);
192d3ea2127SMarek Vasut 	if (ret) {
193d3ea2127SMarek Vasut 		dev_err(dev, "Failed to read product code register (ret=%i)\n",
194d3ea2127SMarek Vasut 			ret);
195d3ea2127SMarek Vasut 		return ret;
196d3ea2127SMarek Vasut 	}
197f16e1fd1SKhiem Nguyen 	ret = regmap_read(regmap, BD9571MWV_PRODUCT_REVISION, &value);
198d3ea2127SMarek Vasut 	if (ret) {
199d3ea2127SMarek Vasut 		dev_err(dev, "Failed to read revision register (ret=%i)\n",
200d3ea2127SMarek Vasut 			ret);
201d3ea2127SMarek Vasut 		return ret;
202d3ea2127SMarek Vasut 	}
203d3ea2127SMarek Vasut 
204d3ea2127SMarek Vasut 	return 0;
205d3ea2127SMarek Vasut }
206d3ea2127SMarek Vasut 
207d3ea2127SMarek Vasut static int bd9571mwv_probe(struct i2c_client *client,
208d3ea2127SMarek Vasut 			   const struct i2c_device_id *ids)
209d3ea2127SMarek Vasut {
210f16e1fd1SKhiem Nguyen 	const struct regmap_config *regmap_config;
211f16e1fd1SKhiem Nguyen 	const struct regmap_irq_chip *irq_chip;
212f16e1fd1SKhiem Nguyen 	const struct mfd_cell *cells;
213f16e1fd1SKhiem Nguyen 	struct device *dev = &client->dev;
214f16e1fd1SKhiem Nguyen 	struct regmap *regmap;
215f16e1fd1SKhiem Nguyen 	struct regmap_irq_chip_data *irq_data;
216f16e1fd1SKhiem Nguyen 	int ret, num_cells, irq = client->irq;
217d3ea2127SMarek Vasut 
218f16e1fd1SKhiem Nguyen 	/* Read the PMIC product code */
219f16e1fd1SKhiem Nguyen 	ret = i2c_smbus_read_byte_data(client, BD9571MWV_PRODUCT_CODE);
220f16e1fd1SKhiem Nguyen 	if (ret < 0) {
221f16e1fd1SKhiem Nguyen 		dev_err(dev, "Failed to read product code\n");
222f16e1fd1SKhiem Nguyen 		return ret;
223d3ea2127SMarek Vasut 	}
224d3ea2127SMarek Vasut 
225f16e1fd1SKhiem Nguyen 	switch (ret) {
226f16e1fd1SKhiem Nguyen 	case BD9571MWV_PRODUCT_CODE_BD9571MWV:
227f16e1fd1SKhiem Nguyen 		regmap_config = &bd9571mwv_regmap_config;
228f16e1fd1SKhiem Nguyen 		irq_chip = &bd9571mwv_irq_chip;
229f16e1fd1SKhiem Nguyen 		cells = bd9571mwv_cells;
230f16e1fd1SKhiem Nguyen 		num_cells = ARRAY_SIZE(bd9571mwv_cells);
231f16e1fd1SKhiem Nguyen 		break;
232*b2548da6SKhiem Nguyen 	case BD9571MWV_PRODUCT_CODE_BD9574MWF:
233*b2548da6SKhiem Nguyen 		regmap_config = &bd9574mwf_regmap_config;
234*b2548da6SKhiem Nguyen 		irq_chip = &bd9574mwf_irq_chip;
235*b2548da6SKhiem Nguyen 		cells = bd9574mwf_cells;
236*b2548da6SKhiem Nguyen 		num_cells = ARRAY_SIZE(bd9574mwf_cells);
237*b2548da6SKhiem Nguyen 		break;
238f16e1fd1SKhiem Nguyen 	default:
239f16e1fd1SKhiem Nguyen 		dev_err(dev, "Unsupported device 0x%x\n", ret);
240f16e1fd1SKhiem Nguyen 		return -ENODEV;
241f16e1fd1SKhiem Nguyen 	}
242f16e1fd1SKhiem Nguyen 
243f16e1fd1SKhiem Nguyen 	regmap = devm_regmap_init_i2c(client, regmap_config);
244f16e1fd1SKhiem Nguyen 	if (IS_ERR(regmap)) {
245f16e1fd1SKhiem Nguyen 		dev_err(dev, "Failed to initialize register map\n");
246f16e1fd1SKhiem Nguyen 		return PTR_ERR(regmap);
247f16e1fd1SKhiem Nguyen 	}
248f16e1fd1SKhiem Nguyen 
249f16e1fd1SKhiem Nguyen 	ret = bd957x_identify(dev, regmap);
250d3ea2127SMarek Vasut 	if (ret)
251d3ea2127SMarek Vasut 		return ret;
252d3ea2127SMarek Vasut 
253f16e1fd1SKhiem Nguyen 	ret = devm_regmap_add_irq_chip(dev, regmap, irq, IRQF_ONESHOT, 0,
254f16e1fd1SKhiem Nguyen 				       irq_chip, &irq_data);
255d3ea2127SMarek Vasut 	if (ret) {
256f16e1fd1SKhiem Nguyen 		dev_err(dev, "Failed to register IRQ chip\n");
257d3ea2127SMarek Vasut 		return ret;
258d3ea2127SMarek Vasut 	}
259d3ea2127SMarek Vasut 
260f16e1fd1SKhiem Nguyen 	return devm_mfd_add_devices(dev, PLATFORM_DEVID_AUTO, cells, num_cells,
261f16e1fd1SKhiem Nguyen 				    NULL, 0, regmap_irq_get_domain(irq_data));
262d3ea2127SMarek Vasut }
263d3ea2127SMarek Vasut 
264d3ea2127SMarek Vasut static const struct of_device_id bd9571mwv_of_match_table[] = {
265d3ea2127SMarek Vasut 	{ .compatible = "rohm,bd9571mwv", },
266*b2548da6SKhiem Nguyen 	{ .compatible = "rohm,bd9574mwf", },
267d3ea2127SMarek Vasut 	{ /* sentinel */ }
268d3ea2127SMarek Vasut };
269d3ea2127SMarek Vasut MODULE_DEVICE_TABLE(of, bd9571mwv_of_match_table);
270d3ea2127SMarek Vasut 
271d3ea2127SMarek Vasut static const struct i2c_device_id bd9571mwv_id_table[] = {
272d3ea2127SMarek Vasut 	{ "bd9571mwv", 0 },
273d3ea2127SMarek Vasut 	{ /* sentinel */ }
274d3ea2127SMarek Vasut };
275d3ea2127SMarek Vasut MODULE_DEVICE_TABLE(i2c, bd9571mwv_id_table);
276d3ea2127SMarek Vasut 
277d3ea2127SMarek Vasut static struct i2c_driver bd9571mwv_driver = {
278d3ea2127SMarek Vasut 	.driver		= {
279d3ea2127SMarek Vasut 		.name	= "bd9571mwv",
280d3ea2127SMarek Vasut 		.of_match_table = bd9571mwv_of_match_table,
281d3ea2127SMarek Vasut 	},
282d3ea2127SMarek Vasut 	.probe		= bd9571mwv_probe,
283d3ea2127SMarek Vasut 	.id_table       = bd9571mwv_id_table,
284d3ea2127SMarek Vasut };
285d3ea2127SMarek Vasut module_i2c_driver(bd9571mwv_driver);
286d3ea2127SMarek Vasut 
287d3ea2127SMarek Vasut MODULE_AUTHOR("Marek Vasut <marek.vasut+renesas@gmail.com>");
288d3ea2127SMarek Vasut MODULE_DESCRIPTION("BD9571MWV PMIC Driver");
289d3ea2127SMarek Vasut MODULE_LICENSE("GPL v2");
290