diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/mfd/da9062-core.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/mfd/da9062-core.c')
| -rw-r--r-- | drivers/mfd/da9062-core.c | 176 | 
1 files changed, 79 insertions, 97 deletions
diff --git a/drivers/mfd/da9062-core.c b/drivers/mfd/da9062-core.c index 40cde51e5719..d073d5f106ec 100644 --- a/drivers/mfd/da9062-core.c +++ b/drivers/mfd/da9062-core.c @@ -181,35 +181,25 @@ static const struct resource da9061_onkey_resources[] = {  	DEFINE_RES_IRQ_NAMED(DA9061_IRQ_ONKEY, "ONKEY"),  }; -static const struct mfd_cell da9061_devs[] = { -	{ -		.name		= "da9061-core", -		.num_resources	= ARRAY_SIZE(da9061_core_resources), -		.resources	= da9061_core_resources, -	}, -	{ -		.name		= "da9062-regulators", -		.num_resources	= ARRAY_SIZE(da9061_regulators_resources), -		.resources	= da9061_regulators_resources, -	}, -	{ -		.name		= "da9061-watchdog", -		.num_resources	= ARRAY_SIZE(da9061_wdt_resources), -		.resources	= da9061_wdt_resources, -		.of_compatible  = "dlg,da9061-watchdog", -	}, -	{ -		.name		= "da9061-thermal", -		.num_resources	= ARRAY_SIZE(da9061_thermal_resources), -		.resources	= da9061_thermal_resources, -		.of_compatible  = "dlg,da9061-thermal", -	}, -	{ -		.name		= "da9061-onkey", -		.num_resources	= ARRAY_SIZE(da9061_onkey_resources), -		.resources	= da9061_onkey_resources, -		.of_compatible = "dlg,da9061-onkey", -	}, +static const struct mfd_cell da9061_devs_irq[] = { +	MFD_CELL_OF("da9061-core", da9061_core_resources, NULL, 0, 0, +		    NULL), +	MFD_CELL_OF("da9062-regulators", da9061_regulators_resources, NULL, 0, 0, +		    NULL), +	MFD_CELL_OF("da9061-watchdog", da9061_wdt_resources, NULL, 0, 0, +		    "dlg,da9061-watchdog"), +	MFD_CELL_OF("da9061-thermal", da9061_thermal_resources, NULL, 0, 0, +		    "dlg,da9061-thermal"), +	MFD_CELL_OF("da9061-onkey", da9061_onkey_resources, NULL, 0, 0, +		    "dlg,da9061-onkey"), +}; + +static const struct mfd_cell da9061_devs_noirq[] = { +	MFD_CELL_OF("da9061-core", NULL, NULL, 0, 0, NULL), +	MFD_CELL_OF("da9062-regulators", NULL, NULL, 0, 0, NULL), +	MFD_CELL_OF("da9061-watchdog", NULL, NULL, 0, 0, "dlg,da9061-watchdog"), +	MFD_CELL_OF("da9061-thermal", NULL, NULL, 0, 0, "dlg,da9061-thermal"), +	MFD_CELL_OF("da9061-onkey", NULL, NULL, 0, 0, "dlg,da9061-onkey"),  };  static const struct resource da9062_core_resources[] = { @@ -245,47 +235,31 @@ static const struct resource da9062_gpio_resources[] = {  	DEFINE_RES_NAMED(DA9062_IRQ_GPI4, 1, "GPI4", IORESOURCE_IRQ),  }; -static const struct mfd_cell da9062_devs[] = { -	{ -		.name		= "da9062-core", -		.num_resources	= ARRAY_SIZE(da9062_core_resources), -		.resources	= da9062_core_resources, -	}, -	{ -		.name		= "da9062-regulators", -		.num_resources	= ARRAY_SIZE(da9062_regulators_resources), -		.resources	= da9062_regulators_resources, -	}, -	{ -		.name		= "da9062-watchdog", -		.num_resources	= ARRAY_SIZE(da9062_wdt_resources), -		.resources	= da9062_wdt_resources, -		.of_compatible  = "dlg,da9062-watchdog", -	}, -	{ -		.name		= "da9062-thermal", -		.num_resources	= ARRAY_SIZE(da9062_thermal_resources), -		.resources	= da9062_thermal_resources, -		.of_compatible  = "dlg,da9062-thermal", -	}, -	{ -		.name		= "da9062-rtc", -		.num_resources	= ARRAY_SIZE(da9062_rtc_resources), -		.resources	= da9062_rtc_resources, -		.of_compatible  = "dlg,da9062-rtc", -	}, -	{ -		.name		= "da9062-onkey", -		.num_resources	= ARRAY_SIZE(da9062_onkey_resources), -		.resources	= da9062_onkey_resources, -		.of_compatible	= "dlg,da9062-onkey", -	}, -	{ -		.name		= "da9062-gpio", -		.num_resources	= ARRAY_SIZE(da9062_gpio_resources), -		.resources	= da9062_gpio_resources, -		.of_compatible	= "dlg,da9062-gpio", -	}, +static const struct mfd_cell da9062_devs_irq[] = { +	MFD_CELL_OF("da9062-core", da9062_core_resources, NULL, 0, 0, +		    NULL), +	MFD_CELL_OF("da9062-regulators", da9062_regulators_resources, NULL, 0, 0, +		    NULL), +	MFD_CELL_OF("da9062-watchdog", da9062_wdt_resources, NULL, 0, 0, +		    "dlg,da9062-watchdog"), +	MFD_CELL_OF("da9062-thermal", da9062_thermal_resources, NULL, 0, 0, +		    "dlg,da9062-thermal"), +	MFD_CELL_OF("da9062-rtc", da9062_rtc_resources, NULL, 0, 0, +		    "dlg,da9062-rtc"), +	MFD_CELL_OF("da9062-onkey", da9062_onkey_resources, NULL, 0, 0, +		    "dlg,da9062-onkey"), +	MFD_CELL_OF("da9062-gpio", da9062_gpio_resources, NULL, 0, 0, +		    "dlg,da9062-gpio"), +}; + +static const struct mfd_cell da9062_devs_noirq[] = { +	MFD_CELL_OF("da9062-core", NULL, NULL, 0, 0, NULL), +	MFD_CELL_OF("da9062-regulators", NULL, NULL, 0, 0, NULL), +	MFD_CELL_OF("da9062-watchdog", NULL, NULL, 0, 0, "dlg,da9062-watchdog"), +	MFD_CELL_OF("da9062-thermal", NULL, NULL, 0, 0, "dlg,da9062-thermal"), +	MFD_CELL_OF("da9062-rtc", NULL, NULL, 0, 0, "dlg,da9062-rtc"), +	MFD_CELL_OF("da9062-onkey", NULL, NULL, 0, 0, "dlg,da9062-onkey"), +	MFD_CELL_OF("da9062-gpio", NULL, NULL, 0, 0, "dlg,da9062-gpio"),  };  static int da9062_clear_fault_log(struct da9062 *chip) @@ -625,7 +599,7 @@ static int da9062_i2c_probe(struct i2c_client *i2c)  {  	const struct i2c_device_id *id = i2c_client_get_device_id(i2c);  	struct da9062 *chip; -	unsigned int irq_base; +	unsigned int irq_base = 0;  	const struct mfd_cell *cell;  	const struct regmap_irq_chip *irq_chip;  	const struct regmap_config *config; @@ -645,22 +619,16 @@ static int da9062_i2c_probe(struct i2c_client *i2c)  	i2c_set_clientdata(i2c, chip);  	chip->dev = &i2c->dev; -	if (!i2c->irq) { -		dev_err(chip->dev, "No IRQ configured\n"); -		return -EINVAL; -	} - +	/* Start with a base configuration without IRQ */  	switch (chip->chip_type) {  	case COMPAT_TYPE_DA9061: -		cell = da9061_devs; -		cell_num = ARRAY_SIZE(da9061_devs); -		irq_chip = &da9061_irq_chip; +		cell = da9061_devs_noirq; +		cell_num = ARRAY_SIZE(da9061_devs_noirq);  		config = &da9061_regmap_config;  		break;  	case COMPAT_TYPE_DA9062: -		cell = da9062_devs; -		cell_num = ARRAY_SIZE(da9062_devs); -		irq_chip = &da9062_irq_chip; +		cell = da9062_devs_noirq; +		cell_num = ARRAY_SIZE(da9062_devs_noirq);  		config = &da9062_regmap_config;  		break;  	default: @@ -695,29 +663,43 @@ static int da9062_i2c_probe(struct i2c_client *i2c)  	if (ret)  		return ret; -	ret = da9062_configure_irq_type(chip, i2c->irq, &trigger_type); -	if (ret < 0) { -		dev_err(chip->dev, "Failed to configure IRQ type\n"); -		return ret; -	} +	/* If IRQ is available, reconfigure it accordingly */ +	if (i2c->irq) { +		if (chip->chip_type == COMPAT_TYPE_DA9061) { +			cell = da9061_devs_irq; +			cell_num = ARRAY_SIZE(da9061_devs_irq); +			irq_chip = &da9061_irq_chip; +		} else { +			cell = da9062_devs_irq; +			cell_num = ARRAY_SIZE(da9062_devs_irq); +			irq_chip = &da9062_irq_chip; +		} -	ret = regmap_add_irq_chip(chip->regmap, i2c->irq, -			trigger_type | IRQF_SHARED | IRQF_ONESHOT, -			-1, irq_chip, &chip->regmap_irq); -	if (ret) { -		dev_err(chip->dev, "Failed to request IRQ %d: %d\n", -			i2c->irq, ret); -		return ret; -	} +		ret = da9062_configure_irq_type(chip, i2c->irq, &trigger_type); +		if (ret < 0) { +			dev_err(chip->dev, "Failed to configure IRQ type\n"); +			return ret; +		} -	irq_base = regmap_irq_chip_get_base(chip->regmap_irq); +		ret = regmap_add_irq_chip(chip->regmap, i2c->irq, +					  trigger_type | IRQF_SHARED | IRQF_ONESHOT, +					  -1, irq_chip, &chip->regmap_irq); +		if (ret) { +			dev_err(chip->dev, "Failed to request IRQ %d: %d\n", +				i2c->irq, ret); +			return ret; +		} + +		irq_base = regmap_irq_chip_get_base(chip->regmap_irq); +	}  	ret = mfd_add_devices(chip->dev, PLATFORM_DEVID_NONE, cell,  			      cell_num, NULL, irq_base,  			      NULL);  	if (ret) {  		dev_err(chip->dev, "Cannot register child devices\n"); -		regmap_del_irq_chip(i2c->irq, chip->regmap_irq); +		if (i2c->irq) +			regmap_del_irq_chip(i2c->irq, chip->regmap_irq);  		return ret;  	}  |