Skip to content

Commit 1247938

Browse files
mwallebroonie
authored andcommitted
regmap-irq: make it possible to add irq_chip do a specific device node
Add a new function regmap_add_irq_chip_np() with its corresponding devm_regmap_add_irq_chip_np() variant. Sometimes one want to register the IRQ domain on a different device node that the one of the regmap node. For example when using a MFD where there are different interrupt controllers and particularly for the generic regmap gpio_chip/irq_chip driver. In this case it is not desireable to have the IRQ domain on the parent node. Signed-off-by: Michael Walle <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 8f3d9f3 commit 1247938

File tree

2 files changed

+78
-16
lines changed

2 files changed

+78
-16
lines changed

drivers/base/regmap/regmap-irq.c

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -541,8 +541,9 @@ static const struct irq_domain_ops regmap_domain_ops = {
541541
};
542542

543543
/**
544-
* regmap_add_irq_chip() - Use standard regmap IRQ controller handling
544+
* regmap_add_irq_chip_np() - Use standard regmap IRQ controller handling
545545
*
546+
* @np: The device_node where the IRQ domain should be added to.
546547
* @map: The regmap for the device.
547548
* @irq: The IRQ the device uses to signal interrupts.
548549
* @irq_flags: The IRQF_ flags to use for the primary interrupt.
@@ -556,9 +557,10 @@ static const struct irq_domain_ops regmap_domain_ops = {
556557
* register cache. The chip driver is responsible for restoring the
557558
* register values used by the IRQ controller over suspend and resume.
558559
*/
559-
int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
560-
int irq_base, const struct regmap_irq_chip *chip,
561-
struct regmap_irq_chip_data **data)
560+
int regmap_add_irq_chip_np(struct device_node *np, struct regmap *map, int irq,
561+
int irq_flags, int irq_base,
562+
const struct regmap_irq_chip *chip,
563+
struct regmap_irq_chip_data **data)
562564
{
563565
struct regmap_irq_chip_data *d;
564566
int i;
@@ -769,12 +771,10 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
769771
}
770772

771773
if (irq_base)
772-
d->domain = irq_domain_add_legacy(map->dev->of_node,
773-
chip->num_irqs, irq_base, 0,
774-
&regmap_domain_ops, d);
774+
d->domain = irq_domain_add_legacy(np, chip->num_irqs, irq_base,
775+
0, &regmap_domain_ops, d);
775776
else
776-
d->domain = irq_domain_add_linear(map->dev->of_node,
777-
chip->num_irqs,
777+
d->domain = irq_domain_add_linear(np, chip->num_irqs,
778778
&regmap_domain_ops, d);
779779
if (!d->domain) {
780780
dev_err(map->dev, "Failed to create IRQ domain\n");
@@ -808,6 +808,30 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
808808
kfree(d);
809809
return ret;
810810
}
811+
EXPORT_SYMBOL_GPL(regmap_add_irq_chip_np);
812+
813+
/**
814+
* regmap_add_irq_chip() - Use standard regmap IRQ controller handling
815+
*
816+
* @map: The regmap for the device.
817+
* @irq: The IRQ the device uses to signal interrupts.
818+
* @irq_flags: The IRQF_ flags to use for the primary interrupt.
819+
* @irq_base: Allocate at specific IRQ number if irq_base > 0.
820+
* @chip: Configuration for the interrupt controller.
821+
* @data: Runtime data structure for the controller, allocated on success.
822+
*
823+
* Returns 0 on success or an errno on failure.
824+
*
825+
* This is the same as regmap_add_irq_chip_np, except that the device
826+
* node of the regmap is used.
827+
*/
828+
int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
829+
int irq_base, const struct regmap_irq_chip *chip,
830+
struct regmap_irq_chip_data **data)
831+
{
832+
return regmap_add_irq_chip_np(map->dev->of_node, map, irq, irq_flags,
833+
irq_base, chip, data);
834+
}
811835
EXPORT_SYMBOL_GPL(regmap_add_irq_chip);
812836

813837
/**
@@ -875,9 +899,10 @@ static int devm_regmap_irq_chip_match(struct device *dev, void *res, void *data)
875899
}
876900

877901
/**
878-
* devm_regmap_add_irq_chip() - Resource manager regmap_add_irq_chip()
902+
* devm_regmap_add_irq_chip_np() - Resource manager regmap_add_irq_chip_np()
879903
*
880904
* @dev: The device pointer on which irq_chip belongs to.
905+
* @np: The device_node where the IRQ domain should be added to.
881906
* @map: The regmap for the device.
882907
* @irq: The IRQ the device uses to signal interrupts
883908
* @irq_flags: The IRQF_ flags to use for the primary interrupt.
@@ -890,10 +915,11 @@ static int devm_regmap_irq_chip_match(struct device *dev, void *res, void *data)
890915
* The &regmap_irq_chip_data will be automatically released when the device is
891916
* unbound.
892917
*/
893-
int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
894-
int irq_flags, int irq_base,
895-
const struct regmap_irq_chip *chip,
896-
struct regmap_irq_chip_data **data)
918+
int devm_regmap_add_irq_chip_np(struct device *dev, struct device_node *np,
919+
struct regmap *map, int irq, int irq_flags,
920+
int irq_base,
921+
const struct regmap_irq_chip *chip,
922+
struct regmap_irq_chip_data **data)
897923
{
898924
struct regmap_irq_chip_data **ptr, *d;
899925
int ret;
@@ -903,8 +929,8 @@ int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
903929
if (!ptr)
904930
return -ENOMEM;
905931

906-
ret = regmap_add_irq_chip(map, irq, irq_flags, irq_base,
907-
chip, &d);
932+
ret = regmap_add_irq_chip_np(np, map, irq, irq_flags, irq_base,
933+
chip, &d);
908934
if (ret < 0) {
909935
devres_free(ptr);
910936
return ret;
@@ -915,6 +941,32 @@ int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
915941
*data = d;
916942
return 0;
917943
}
944+
EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip_np);
945+
946+
/**
947+
* devm_regmap_add_irq_chip() - Resource manager regmap_add_irq_chip()
948+
*
949+
* @dev: The device pointer on which irq_chip belongs to.
950+
* @map: The regmap for the device.
951+
* @irq: The IRQ the device uses to signal interrupts
952+
* @irq_flags: The IRQF_ flags to use for the primary interrupt.
953+
* @irq_base: Allocate at specific IRQ number if irq_base > 0.
954+
* @chip: Configuration for the interrupt controller.
955+
* @data: Runtime data structure for the controller, allocated on success
956+
*
957+
* Returns 0 on success or an errno on failure.
958+
*
959+
* The &regmap_irq_chip_data will be automatically released when the device is
960+
* unbound.
961+
*/
962+
int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
963+
int irq_flags, int irq_base,
964+
const struct regmap_irq_chip *chip,
965+
struct regmap_irq_chip_data **data)
966+
{
967+
return devm_regmap_add_irq_chip_np(dev, map->dev->of_node, map, irq,
968+
irq_flags, irq_base, chip, data);
969+
}
918970
EXPORT_SYMBOL_GPL(devm_regmap_add_irq_chip);
919971

920972
/**

include/linux/regmap.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
struct module;
2222
struct clk;
2323
struct device;
24+
struct device_node;
2425
struct i2c_client;
2526
struct i3c_device;
2627
struct irq_domain;
@@ -1310,12 +1311,21 @@ struct regmap_irq_chip_data;
13101311
int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
13111312
int irq_base, const struct regmap_irq_chip *chip,
13121313
struct regmap_irq_chip_data **data);
1314+
int regmap_add_irq_chip_np(struct device_node *np, struct regmap *map, int irq,
1315+
int irq_flags, int irq_base,
1316+
const struct regmap_irq_chip *chip,
1317+
struct regmap_irq_chip_data **data);
13131318
void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *data);
13141319

13151320
int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,
13161321
int irq_flags, int irq_base,
13171322
const struct regmap_irq_chip *chip,
13181323
struct regmap_irq_chip_data **data);
1324+
int devm_regmap_add_irq_chip_np(struct device *dev, struct device_node *np,
1325+
struct regmap *map, int irq, int irq_flags,
1326+
int irq_base,
1327+
const struct regmap_irq_chip *chip,
1328+
struct regmap_irq_chip_data **data);
13191329
void devm_regmap_del_irq_chip(struct device *dev, int irq,
13201330
struct regmap_irq_chip_data *data);
13211331

0 commit comments

Comments
 (0)