File Index
Files and directories
Sign in
FILE

max77759.c

File preview with syntax highlighting.

linux-6.19.14/drivers/mfd/max77759.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Copyright 2020 Google Inc
  4 * Copyright 2025 Linaro Ltd.
  5 *
  6 * Core driver for Maxim MAX77759 companion PMIC for USB Type-C
  7 */
  8
  9#include <linux/array_size.h>
 10#include <linux/bitfield.h>
 11#include <linux/bits.h>
 12#include <linux/cleanup.h>
 13#include <linux/completion.h>
 14#include <linux/dev_printk.h>
 15#include <linux/device.h>
 16#include <linux/err.h>
 17#include <linux/i2c.h>
 18#include <linux/init.h>
 19#include <linux/interrupt.h>
 20#include <linux/irq.h>
 21#include <linux/jiffies.h>
 22#include <linux/mfd/core.h>
 23#include <linux/mfd/max77759.h>
 24#include <linux/mod_devicetable.h>
 25#include <linux/module.h>
 26#include <linux/mutex.h>
 27#include <linux/of.h>
 28#include <linux/overflow.h>
 29#include <linux/regmap.h>
 30
 31/* Chip ID as per MAX77759_PMIC_REG_PMIC_ID */
 32enum {
 33	MAX77759_CHIP_ID = 59,
 34};
 35
 36enum max77759_i2c_subdev_id {
 37	/*
 38	 * These are arbitrary and simply used to match struct
 39	 * max77759_i2c_subdev entries to the regmap pointers in struct
 40	 * max77759 during probe().
 41	 */
 42	MAX77759_I2C_SUBDEV_ID_MAXQ,
 43	MAX77759_I2C_SUBDEV_ID_CHARGER,
 44};
 45
 46struct max77759_i2c_subdev {
 47	enum max77759_i2c_subdev_id id;
 48	const struct regmap_config *cfg;
 49	u16 i2c_address;
 50};
 51
 52static const struct regmap_range max77759_top_registers[] = {
 53	regmap_reg_range(0x00, 0x02), /* PMIC_ID / PMIC_REVISION / OTP_REVISION */
 54	regmap_reg_range(0x22, 0x24), /* INTSRC / INTSRCMASK / TOPSYS_INT */
 55	regmap_reg_range(0x26, 0x26), /* TOPSYS_INT_MASK */
 56	regmap_reg_range(0x40, 0x40), /* I2C_CNFG */
 57	regmap_reg_range(0x50, 0x51), /* SWRESET / CONTROL_FG */
 58};
 59
 60static const struct regmap_range max77759_top_ro_registers[] = {
 61	regmap_reg_range(0x00, 0x02),
 62	regmap_reg_range(0x22, 0x22),
 63};
 64
 65static const struct regmap_range max77759_top_volatile_registers[] = {
 66	regmap_reg_range(0x22, 0x22),
 67	regmap_reg_range(0x24, 0x24),
 68};
 69
 70static const struct regmap_access_table max77759_top_wr_table = {
 71	.yes_ranges = max77759_top_registers,
 72	.n_yes_ranges = ARRAY_SIZE(max77759_top_registers),
 73	.no_ranges = max77759_top_ro_registers,
 74	.n_no_ranges = ARRAY_SIZE(max77759_top_ro_registers),
 75};
 76
 77static const struct regmap_access_table max77759_top_rd_table = {
 78	.yes_ranges = max77759_top_registers,
 79	.n_yes_ranges = ARRAY_SIZE(max77759_top_registers),
 80};
 81
 82static const struct regmap_access_table max77759_top_volatile_table = {
 83	.yes_ranges = max77759_top_volatile_registers,
 84	.n_yes_ranges = ARRAY_SIZE(max77759_top_volatile_registers),
 85};
 86
 87static const struct regmap_config max77759_regmap_config_top = {
 88	.name = "top",
 89	.reg_bits = 8,
 90	.val_bits = 8,
 91	.max_register = MAX77759_PMIC_REG_CONTROL_FG,
 92	.wr_table = &max77759_top_wr_table,
 93	.rd_table = &max77759_top_rd_table,
 94	.volatile_table = &max77759_top_volatile_table,
 95	.num_reg_defaults_raw = MAX77759_PMIC_REG_CONTROL_FG + 1,
 96	.cache_type = REGCACHE_FLAT,
 97};
 98
 99static const struct regmap_range max77759_maxq_registers[] = {
100	regmap_reg_range(0x60, 0x73), /* Device ID, Rev, INTx, STATUSx, MASKx */
101	regmap_reg_range(0x81, 0xa1), /* AP_DATAOUTx */
102	regmap_reg_range(0xb1, 0xd1), /* AP_DATAINx */
103	regmap_reg_range(0xe0, 0xe0), /* UIC_SWRST */
104};
105
106static const struct regmap_range max77759_maxq_ro_registers[] = {
107	regmap_reg_range(0x60, 0x63), /* Device ID, Rev */
108	regmap_reg_range(0x68, 0x6f), /* STATUSx */
109	regmap_reg_range(0xb1, 0xd1),
110};
111
112static const struct regmap_range max77759_maxq_volatile_registers[] = {
113	regmap_reg_range(0x64, 0x6f), /* INTx, STATUSx */
114	regmap_reg_range(0xb1, 0xd1),
115	regmap_reg_range(0xe0, 0xe0),
116};
117
118static const struct regmap_access_table max77759_maxq_wr_table = {
119	.yes_ranges = max77759_maxq_registers,
120	.n_yes_ranges = ARRAY_SIZE(max77759_maxq_registers),
121	.no_ranges = max77759_maxq_ro_registers,
122	.n_no_ranges = ARRAY_SIZE(max77759_maxq_ro_registers),
123};
124
125static const struct regmap_access_table max77759_maxq_rd_table = {
126	.yes_ranges = max77759_maxq_registers,
127	.n_yes_ranges = ARRAY_SIZE(max77759_maxq_registers),
128};
129
130static const struct regmap_access_table max77759_maxq_volatile_table = {
131	.yes_ranges = max77759_maxq_volatile_registers,
132	.n_yes_ranges = ARRAY_SIZE(max77759_maxq_volatile_registers),
133};
134
135static const struct regmap_config max77759_regmap_config_maxq = {
136	.name = "maxq",
137	.reg_bits = 8,
138	.val_bits = 8,
139	.max_register = MAX77759_MAXQ_REG_UIC_SWRST,
140	.wr_table = &max77759_maxq_wr_table,
141	.rd_table = &max77759_maxq_rd_table,
142	.volatile_table = &max77759_maxq_volatile_table,
143	.num_reg_defaults_raw = MAX77759_MAXQ_REG_UIC_SWRST + 1,
144	.cache_type = REGCACHE_FLAT,
145};
146
147static const struct regmap_range max77759_charger_registers[] = {
148	regmap_reg_range(0xb0, 0xcc),
149};
150
151static const struct regmap_range max77759_charger_ro_registers[] = {
152	regmap_reg_range(0xb4, 0xb8), /* INT_OK, DETAILS_0x */
153};
154
155static const struct regmap_range max77759_charger_volatile_registers[] = {
156	regmap_reg_range(0xb0, 0xb1), /* INTx */
157	regmap_reg_range(0xb4, 0xb8),
158};
159
160static const struct regmap_access_table max77759_charger_wr_table = {
161	.yes_ranges = max77759_charger_registers,
162	.n_yes_ranges = ARRAY_SIZE(max77759_charger_registers),
163	.no_ranges = max77759_charger_ro_registers,
164	.n_no_ranges = ARRAY_SIZE(max77759_charger_ro_registers),
165};
166
167static const struct regmap_access_table max77759_charger_rd_table = {
168	.yes_ranges = max77759_charger_registers,
169	.n_yes_ranges = ARRAY_SIZE(max77759_charger_registers),
170};
171
172static const struct regmap_access_table max77759_charger_volatile_table = {
173	.yes_ranges = max77759_charger_volatile_registers,
174	.n_yes_ranges = ARRAY_SIZE(max77759_charger_volatile_registers),
175};
176
177static const struct regmap_config max77759_regmap_config_charger = {
178	.name = "charger",
179	.reg_bits = 8,
180	.val_bits = 8,
181	.max_register = MAX77759_CHGR_REG_CHG_CNFG_19,
182	.wr_table = &max77759_charger_wr_table,
183	.rd_table = &max77759_charger_rd_table,
184	.volatile_table = &max77759_charger_volatile_table,
185	.num_reg_defaults_raw = MAX77759_CHGR_REG_CHG_CNFG_19 + 1,
186	.cache_type = REGCACHE_FLAT,
187};
188
189/*
190 * Interrupts - with the following interrupt hierarchy:
191 *   pmic IRQs (INTSRC)
192 *     - MAXQ_INT: MaxQ IRQs
193 *       - UIC_INT1
194 *         - APCmdResI
195 *         - SysMsgI
196 *         - GPIOxI
197 *     - TOPSYS_INT: topsys
198 *       - TOPSYS_INT
199 *         - TSHDN_INT
200 *         - SYSOVLO_INT
201 *         - SYSUVLO_INT
202 *         - FSHIP_NOT_RD
203 *     - CHGR_INT: charger
204 *       - CHG_INT
205 *       - CHG_INT2
206 */
207enum {
208	MAX77759_INT_MAXQ,
209	MAX77759_INT_TOPSYS,
210	MAX77759_INT_CHGR,
211};
212
213enum {
214	MAX77759_TOPSYS_INT_TSHDN,
215	MAX77759_TOPSYS_INT_SYSOVLO,
216	MAX77759_TOPSYS_INT_SYSUVLO,
217	MAX77759_TOPSYS_INT_FSHIP_NOT_RD,
218};
219
220enum {
221	MAX77759_MAXQ_INT_APCMDRESI,
222	MAX77759_MAXQ_INT_SYSMSGI,
223	MAX77759_MAXQ_INT_GPIO,
224	MAX77759_MAXQ_INT_UIC1,
225	MAX77759_MAXQ_INT_UIC2,
226	MAX77759_MAXQ_INT_UIC3,
227	MAX77759_MAXQ_INT_UIC4,
228};
229
230enum {
231	MAX77759_CHARGER_INT_1,
232	MAX77759_CHARGER_INT_2,
233};
234
235static const struct regmap_irq max77759_pmic_irqs[] = {
236	REGMAP_IRQ_REG(MAX77759_INT_MAXQ, 0, MAX77759_PMIC_REG_INTSRC_MAXQ),
237	REGMAP_IRQ_REG(MAX77759_INT_TOPSYS, 0, MAX77759_PMIC_REG_INTSRC_TOPSYS),
238	REGMAP_IRQ_REG(MAX77759_INT_CHGR, 0, MAX77759_PMIC_REG_INTSRC_CHGR),
239};
240
241static const struct regmap_irq max77759_maxq_irqs[] = {
242	REGMAP_IRQ_REG(MAX77759_MAXQ_INT_APCMDRESI, 0, MAX77759_MAXQ_REG_UIC_INT1_APCMDRESI),
243	REGMAP_IRQ_REG(MAX77759_MAXQ_INT_SYSMSGI, 0, MAX77759_MAXQ_REG_UIC_INT1_SYSMSGI),
244	REGMAP_IRQ_REG(MAX77759_MAXQ_INT_GPIO, 0, GENMASK(1, 0)),
245	REGMAP_IRQ_REG(MAX77759_MAXQ_INT_UIC1, 0, GENMASK(5, 2)),
246	REGMAP_IRQ_REG(MAX77759_MAXQ_INT_UIC2, 1, GENMASK(7, 0)),
247	REGMAP_IRQ_REG(MAX77759_MAXQ_INT_UIC3, 2, GENMASK(7, 0)),
248	REGMAP_IRQ_REG(MAX77759_MAXQ_INT_UIC4, 3, GENMASK(7, 0)),
249};
250
251static const struct regmap_irq max77759_topsys_irqs[] = {
252	REGMAP_IRQ_REG(MAX77759_TOPSYS_INT_TSHDN, 0, MAX77759_PMIC_REG_TOPSYS_INT_TSHDN),
253	REGMAP_IRQ_REG(MAX77759_TOPSYS_INT_SYSOVLO, 0, MAX77759_PMIC_REG_TOPSYS_INT_SYSOVLO),
254	REGMAP_IRQ_REG(MAX77759_TOPSYS_INT_SYSUVLO, 0, MAX77759_PMIC_REG_TOPSYS_INT_SYSUVLO),
255	REGMAP_IRQ_REG(MAX77759_TOPSYS_INT_FSHIP_NOT_RD, 0, MAX77759_PMIC_REG_TOPSYS_INT_FSHIP),
256};
257
258static const struct regmap_irq max77759_chgr_irqs[] = {
259	REGMAP_IRQ_REG(MAX77759_CHARGER_INT_1, 0, GENMASK(7, 0)),
260	REGMAP_IRQ_REG(MAX77759_CHARGER_INT_2, 1, GENMASK(7, 0)),
261};
262
263static const struct regmap_irq_chip max77759_pmic_irq_chip = {
264	.name = "max77759-pmic",
265	/* INTSRC is read-only and doesn't require clearing */
266	.status_base = MAX77759_PMIC_REG_INTSRC,
267	.mask_base = MAX77759_PMIC_REG_INTSRCMASK,
268	.num_regs = 1,
269	.irqs = max77759_pmic_irqs,
270	.num_irqs = ARRAY_SIZE(max77759_pmic_irqs),
271};
272
273/*
274 * We can let regmap-irq auto-ack the topsys interrupt bits as required, but
275 * for all others the individual drivers need to know which interrupt bit
276 * exactly is set inside their interrupt handlers, and therefore we can not set
277 * .ack_base for those.
278 */
279static const struct regmap_irq_chip max77759_maxq_irq_chip = {
280	.name = "max77759-maxq",
281	.domain_suffix = "MAXQ",
282	.status_base = MAX77759_MAXQ_REG_UIC_INT1,
283	.mask_base = MAX77759_MAXQ_REG_UIC_INT1_M,
284	.num_regs = 4,
285	.irqs = max77759_maxq_irqs,
286	.num_irqs = ARRAY_SIZE(max77759_maxq_irqs),
287};
288
289static const struct regmap_irq_chip max77759_topsys_irq_chip = {
290	.name = "max77759-topsys",
291	.domain_suffix = "TOPSYS",
292	.status_base = MAX77759_PMIC_REG_TOPSYS_INT,
293	.mask_base = MAX77759_PMIC_REG_TOPSYS_INT_MASK,
294	.ack_base = MAX77759_PMIC_REG_TOPSYS_INT,
295	.num_regs = 1,
296	.irqs = max77759_topsys_irqs,
297	.num_irqs = ARRAY_SIZE(max77759_topsys_irqs),
298};
299
300static const struct regmap_irq_chip max77759_chrg_irq_chip = {
301	.name = "max77759-chgr",
302	.domain_suffix = "CHGR",
303	.status_base = MAX77759_CHGR_REG_CHG_INT,
304	.mask_base = MAX77759_CHGR_REG_CHG_INT_MASK,
305	.num_regs = 2,
306	.irqs = max77759_chgr_irqs,
307	.num_irqs = ARRAY_SIZE(max77759_chgr_irqs),
308};
309
310static const struct max77759_i2c_subdev max77759_i2c_subdevs[] = {
311	{
312		.id = MAX77759_I2C_SUBDEV_ID_MAXQ,
313		.cfg = &max77759_regmap_config_maxq,
314		/* I2C address is same as for sub-block 'top' */
315	},
316	{
317		.id = MAX77759_I2C_SUBDEV_ID_CHARGER,
318		.cfg = &max77759_regmap_config_charger,
319		.i2c_address = 0x69,
320	},
321};
322
323static const struct resource max77759_gpio_resources[] = {
324	DEFINE_RES_IRQ_NAMED(MAX77759_MAXQ_INT_GPIO, "GPI"),
325};
326
327static const struct resource max77759_charger_resources[] = {
328	DEFINE_RES_IRQ_NAMED(MAX77759_CHARGER_INT_1, "INT1"),
329	DEFINE_RES_IRQ_NAMED(MAX77759_CHARGER_INT_2, "INT2"),
330};
331
332static const struct mfd_cell max77759_cells[] = {
333	MFD_CELL_OF("max77759-nvmem", NULL, NULL, 0, 0,
334		    "maxim,max77759-nvmem"),
335};
336
337static const struct mfd_cell max77759_maxq_cells[] = {
338	MFD_CELL_OF("max77759-gpio", max77759_gpio_resources, NULL, 0, 0,
339		    "maxim,max77759-gpio"),
340};
341
342static const struct mfd_cell max77759_charger_cells[] = {
343	MFD_CELL_RES("max77759-charger", max77759_charger_resources),
344};
345
346int max77759_maxq_command(struct max77759 *max77759,
347			  const struct max77759_maxq_command *cmd,
348			  struct max77759_maxq_response *rsp)
349{
350	DEFINE_FLEX(struct max77759_maxq_response, _rsp, rsp, length, 1);
351	struct device *dev = regmap_get_device(max77759->regmap_maxq);
352	static const unsigned int timeout_ms = 200;
353	int ret;
354
355	if (cmd->length > MAX77759_MAXQ_OPCODE_MAXLENGTH)
356		return -EINVAL;
357
358	/*
359	 * As a convenience for API users when issuing simple commands, rsp is
360	 * allowed to be NULL. In that case we need a temporary here to write
361	 * the response to, as we need to verify that the command was indeed
362	 * completed correctly.
363	 */
364	if (!rsp)
365		rsp = _rsp;
366
367	if (!rsp->length || rsp->length > MAX77759_MAXQ_OPCODE_MAXLENGTH)
368		return -EINVAL;
369
370	guard(mutex)(&max77759->maxq_lock);
371
372	reinit_completion(&max77759->cmd_done);
373
374	/*
375	 * MaxQ latches the message when the DATAOUT32 register is written. If
376	 * cmd->length is shorter we still need to write 0 to it.
377	 */
378	ret = regmap_bulk_write(max77759->regmap_maxq,
379				MAX77759_MAXQ_REG_AP_DATAOUT0, cmd->cmd,
380				cmd->length);
381	if (!ret && cmd->length < MAX77759_MAXQ_OPCODE_MAXLENGTH)
382		ret = regmap_write(max77759->regmap_maxq,
383				   MAX77759_MAXQ_REG_AP_DATAOUT32, 0);
384	if (ret) {
385		dev_err(dev, "writing command failed: %d\n", ret);
386		return ret;
387	}
388
389	/* Wait for response from MaxQ */
390	if (!wait_for_completion_timeout(&max77759->cmd_done,
391					 msecs_to_jiffies(timeout_ms))) {
392		dev_err(dev, "timed out waiting for response\n");
393		return -ETIMEDOUT;
394	}
395
396	ret = regmap_bulk_read(max77759->regmap_maxq,
397			       MAX77759_MAXQ_REG_AP_DATAIN0,
398			       rsp->rsp, rsp->length);
399	if (ret) {
400		dev_err(dev, "reading response failed: %d\n", ret);
401		return ret;
402	}
403
404	/*
405	 * As per the protocol, the first byte of the reply will match the
406	 * request.
407	 */
408	if (cmd->cmd[0] != rsp->rsp[0]) {
409		dev_err(dev, "unexpected opcode response for %#.2x: %*ph\n",
410			cmd->cmd[0], (int)rsp->length, rsp->rsp);
411		return -EIO;
412	}
413
414	return 0;
415}
416EXPORT_SYMBOL_GPL(max77759_maxq_command);
417
418static irqreturn_t apcmdres_irq_handler(int irq, void *irq_data)
419{
420	struct max77759 *max77759 = irq_data;
421
422	regmap_write(max77759->regmap_maxq, MAX77759_MAXQ_REG_UIC_INT1,
423		     MAX77759_MAXQ_REG_UIC_INT1_APCMDRESI);
424
425	complete(&max77759->cmd_done);
426
427	return IRQ_HANDLED;
428}
429
430static int max77759_create_i2c_subdev(struct i2c_client *client,
431				      struct max77759 *max77759,
432				      const struct max77759_i2c_subdev *sd)
433{
434	struct i2c_client *sub;
435	struct regmap *regmap;
436	int ret;
437
438	/*
439	 * If 'sd' has an I2C address, 'sub' will be assigned a new 'dummy'
440	 * device, otherwise use it as-is.
441	 */
442	sub = client;
443	if (sd->i2c_address) {
444		sub = devm_i2c_new_dummy_device(&client->dev,
445						client->adapter,
446						sd->i2c_address);
447
448		if (IS_ERR(sub))
449			return dev_err_probe(&client->dev, PTR_ERR(sub),
450					"failed to claim I2C device %s\n",
451					sd->cfg->name);
452	}
453
454	regmap = devm_regmap_init_i2c(sub, sd->cfg);
455	if (IS_ERR(regmap))
456		return dev_err_probe(&sub->dev, PTR_ERR(regmap),
457				     "regmap init for '%s' failed\n",
458				     sd->cfg->name);
459
460	ret = regmap_attach_dev(&client->dev, regmap, sd->cfg);
461	if (ret)
462		return dev_err_probe(&client->dev, ret,
463				     "regmap attach of '%s' failed\n",
464				     sd->cfg->name);
465
466	if (sd->id == MAX77759_I2C_SUBDEV_ID_MAXQ)
467		max77759->regmap_maxq = regmap;
468	else if (sd->id == MAX77759_I2C_SUBDEV_ID_CHARGER)
469		max77759->regmap_charger = regmap;
470
471	return 0;
472}
473
474static int max77759_add_chained_irq_chip(struct device *dev,
475					 struct regmap *regmap,
476					 int pirq,
477					 struct regmap_irq_chip_data *parent,
478					 const struct regmap_irq_chip *chip,
479					 struct regmap_irq_chip_data **data)
480{
481	int irq, ret;
482
483	irq = regmap_irq_get_virq(parent, pirq);
484	if (irq < 0)
485		return dev_err_probe(dev, irq,
486				     "failed to get parent vIRQ(%d) for chip %s\n",
487				     pirq, chip->name);
488
489	ret = devm_regmap_add_irq_chip(dev, regmap, irq,
490				       IRQF_ONESHOT | IRQF_SHARED, 0, chip,
491				       data);
492	if (ret)
493		return dev_err_probe(dev, ret, "failed to add %s IRQ chip\n",
494				     chip->name);
495
496	return 0;
497}
498
499static int max77759_add_chained_maxq(struct i2c_client *client,
500				     struct max77759 *max77759,
501				     struct regmap_irq_chip_data *parent)
502{
503	struct regmap_irq_chip_data *irq_chip_data;
504	int apcmdres_irq;
505	int ret;
506
507	ret = max77759_add_chained_irq_chip(&client->dev,
508					    max77759->regmap_maxq,
509					    MAX77759_INT_MAXQ,
510					    parent,
511					    &max77759_maxq_irq_chip,
512					    &irq_chip_data);
513	if (ret)
514		return ret;
515
516	init_completion(&max77759->cmd_done);
517	apcmdres_irq = regmap_irq_get_virq(irq_chip_data,
518					   MAX77759_MAXQ_INT_APCMDRESI);
519
520	ret = devm_request_threaded_irq(&client->dev, apcmdres_irq,
521					NULL, apcmdres_irq_handler,
522					IRQF_ONESHOT | IRQF_SHARED,
523					dev_name(&client->dev), max77759);
524	if (ret)
525		return dev_err_probe(&client->dev, ret,
526				     "MAX77759_MAXQ_INT_APCMDRESI failed\n");
527
528	ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_AUTO,
529				   max77759_maxq_cells,
530				   ARRAY_SIZE(max77759_maxq_cells),
531				   NULL, 0,
532				   regmap_irq_get_domain(irq_chip_data));
533	if (ret)
534		return dev_err_probe(&client->dev, ret,
535				     "failed to add child devices (MaxQ)\n");
536
537	return 0;
538}
539
540static int max77759_add_chained_topsys(struct i2c_client *client,
541				       struct max77759 *max77759,
542				       struct regmap_irq_chip_data *parent)
543{
544	struct regmap_irq_chip_data *irq_chip_data;
545	int ret;
546
547	ret = max77759_add_chained_irq_chip(&client->dev,
548					    max77759->regmap_top,
549					    MAX77759_INT_TOPSYS,
550					    parent,
551					    &max77759_topsys_irq_chip,
552					    &irq_chip_data);
553	if (ret)
554		return ret;
555
556	return 0;
557}
558
559static int max77759_add_chained_charger(struct i2c_client *client,
560					struct max77759 *max77759,
561					struct regmap_irq_chip_data *parent)
562{
563	struct regmap_irq_chip_data *irq_chip_data;
564	int ret;
565
566	ret = max77759_add_chained_irq_chip(&client->dev,
567					    max77759->regmap_charger,
568					    MAX77759_INT_CHGR,
569					    parent,
570					    &max77759_chrg_irq_chip,
571					    &irq_chip_data);
572	if (ret)
573		return ret;
574
575	ret = devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_AUTO,
576				   max77759_charger_cells,
577				   ARRAY_SIZE(max77759_charger_cells),
578				   NULL, 0,
579				   regmap_irq_get_domain(irq_chip_data));
580	if (ret)
581		return dev_err_probe(&client->dev, ret,
582				     "failed to add child devices (charger)\n");
583
584	return 0;
585}
586
587static int max77759_probe(struct i2c_client *client)
588{
589	struct regmap_irq_chip_data *irq_chip_data_pmic;
590	struct irq_data *irq_data;
591	struct max77759 *max77759;
592	unsigned long irq_flags;
593	unsigned int pmic_id;
594	int ret;
595
596	max77759 = devm_kzalloc(&client->dev, sizeof(*max77759), GFP_KERNEL);
597	if (!max77759)
598		return -ENOMEM;
599
600	i2c_set_clientdata(client, max77759);
601
602	max77759->regmap_top = devm_regmap_init_i2c(client,
603						    &max77759_regmap_config_top);
604	if (IS_ERR(max77759->regmap_top))
605		return dev_err_probe(&client->dev, PTR_ERR(max77759->regmap_top),
606				     "regmap init for '%s' failed\n",
607				     max77759_regmap_config_top.name);
608
609	ret = regmap_read(max77759->regmap_top,
610			  MAX77759_PMIC_REG_PMIC_ID, &pmic_id);
611	if (ret)
612		return dev_err_probe(&client->dev, ret,
613				     "unable to read device ID\n");
614
615	if (pmic_id != MAX77759_CHIP_ID)
616		return dev_err_probe(&client->dev, -ENODEV,
617				     "unsupported device ID %#.2x (%d)\n",
618				     pmic_id, pmic_id);
619
620	ret = devm_mutex_init(&client->dev, &max77759->maxq_lock);
621	if (ret)
622		return ret;
623
624	for (int i = 0; i < ARRAY_SIZE(max77759_i2c_subdevs); i++) {
625		ret = max77759_create_i2c_subdev(client, max77759,
626						 &max77759_i2c_subdevs[i]);
627		if (ret)
628			return ret;
629	}
630
631	irq_data = irq_get_irq_data(client->irq);
632	if (!irq_data)
633		return dev_err_probe(&client->dev, -EINVAL,
634				     "invalid IRQ: %d\n", client->irq);
635
636	irq_flags = IRQF_ONESHOT | IRQF_SHARED;
637	irq_flags |= irqd_get_trigger_type(irq_data);
638
639	ret = devm_regmap_add_irq_chip(&client->dev, max77759->regmap_top,
640				       client->irq, irq_flags, 0,
641				       &max77759_pmic_irq_chip,
642				       &irq_chip_data_pmic);
643	if (ret)
644		return dev_err_probe(&client->dev, ret,
645				     "failed to add IRQ chip '%s'\n",
646				     max77759_pmic_irq_chip.name);
647
648	ret = max77759_add_chained_maxq(client, max77759, irq_chip_data_pmic);
649	if (ret)
650		return ret;
651
652	ret = max77759_add_chained_topsys(client, max77759, irq_chip_data_pmic);
653	if (ret)
654		return ret;
655
656	ret = max77759_add_chained_charger(client, max77759, irq_chip_data_pmic);
657	if (ret)
658		return ret;
659
660	return devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_AUTO,
661				    max77759_cells, ARRAY_SIZE(max77759_cells),
662				    NULL, 0,
663				    regmap_irq_get_domain(irq_chip_data_pmic));
664}
665
666static const struct i2c_device_id max77759_i2c_id[] = {
667	{ "max77759" },
668	{ }
669};
670MODULE_DEVICE_TABLE(i2c, max77759_i2c_id);
671
672static const struct of_device_id max77759_of_id[] = {
673	{ .compatible = "maxim,max77759", },
674	{ }
675};
676MODULE_DEVICE_TABLE(of, max77759_of_id);
677
678static struct i2c_driver max77759_i2c_driver = {
679	.driver = {
680		.name = "max77759",
681		.of_match_table = max77759_of_id,
682	},
683	.probe = max77759_probe,
684	.id_table = max77759_i2c_id,
685};
686module_i2c_driver(max77759_i2c_driver);
687
688MODULE_AUTHOR("André Draszik <andre.draszik@linaro.org>");
689MODULE_DESCRIPTION("Maxim MAX77759 core driver");
690MODULE_LICENSE("GPL");
~/ Read-only file preview.