Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'soundwire-6.6-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire

Pull soundwire fix from Vinod Koul:
"A single fix for making sdw bus irq conditionally built"

* tag 'soundwire-6.6-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/soundwire:
soundwire: bus: Make IRQ handling conditionally built

+115 -33
+4
drivers/soundwire/Makefile
··· 15 15 soundwire-bus-y += debugfs.o 16 16 endif 17 17 18 + ifdef CONFIG_IRQ_DOMAIN 19 + soundwire-bus-y += irq.o 20 + endif 21 + 18 22 #AMD driver 19 23 soundwire-amd-y := amd_manager.o 20 24 obj-$(CONFIG_SOUNDWIRE_AMD) += soundwire-amd.o
+5 -26
drivers/soundwire/bus.c
··· 3 3 4 4 #include <linux/acpi.h> 5 5 #include <linux/delay.h> 6 - #include <linux/irq.h> 7 6 #include <linux/mod_devicetable.h> 8 7 #include <linux/pm_runtime.h> 9 8 #include <linux/soundwire/sdw_registers.h> 10 9 #include <linux/soundwire/sdw.h> 11 10 #include <linux/soundwire/sdw_type.h> 12 11 #include "bus.h" 12 + #include "irq.h" 13 13 #include "sysfs_local.h" 14 14 15 15 static DEFINE_IDA(sdw_bus_ida); ··· 24 24 bus->id = rc; 25 25 return 0; 26 26 } 27 - 28 - static int sdw_irq_map(struct irq_domain *h, unsigned int virq, 29 - irq_hw_number_t hw) 30 - { 31 - struct sdw_bus *bus = h->host_data; 32 - 33 - irq_set_chip_data(virq, bus); 34 - irq_set_chip(virq, &bus->irq_chip); 35 - irq_set_nested_thread(virq, 1); 36 - irq_set_noprobe(virq); 37 - 38 - return 0; 39 - } 40 - 41 - static const struct irq_domain_ops sdw_domain_ops = { 42 - .map = sdw_irq_map, 43 - }; 44 27 45 28 /** 46 29 * sdw_bus_master_add() - add a bus Master instance ··· 151 168 bus->params.curr_bank = SDW_BANK0; 152 169 bus->params.next_bank = SDW_BANK1; 153 170 154 - bus->irq_chip.name = dev_name(bus->dev); 155 - bus->domain = irq_domain_create_linear(fwnode, SDW_MAX_DEVICES, 156 - &sdw_domain_ops, bus); 157 - if (!bus->domain) { 158 - dev_err(bus->dev, "Failed to add IRQ domain\n"); 159 - return -EINVAL; 160 - } 171 + ret = sdw_irq_create(bus, fwnode); 172 + if (ret) 173 + return ret; 161 174 162 175 return 0; 163 176 } ··· 192 213 { 193 214 device_for_each_child(bus->dev, NULL, sdw_delete_slave); 194 215 195 - irq_domain_remove(bus->domain); 216 + sdw_irq_delete(bus); 196 217 197 218 sdw_master_device_del(bus); 198 219
+4 -7
drivers/soundwire/bus_type.c
··· 7 7 #include <linux/soundwire/sdw.h> 8 8 #include <linux/soundwire/sdw_type.h> 9 9 #include "bus.h" 10 + #include "irq.h" 10 11 #include "sysfs_local.h" 11 12 12 13 /** ··· 123 122 if (drv->ops && drv->ops->read_prop) 124 123 drv->ops->read_prop(slave); 125 124 126 - if (slave->prop.use_domain_irq) { 127 - slave->irq = irq_create_mapping(slave->bus->domain, slave->dev_num); 128 - if (!slave->irq) 129 - dev_warn(dev, "Failed to map IRQ\n"); 130 - } 125 + if (slave->prop.use_domain_irq) 126 + sdw_irq_create_mapping(slave); 131 127 132 128 /* init the sysfs as we have properties now */ 133 129 ret = sdw_slave_sysfs_init(slave); ··· 174 176 slave->probed = false; 175 177 176 178 if (slave->prop.use_domain_irq) 177 - irq_dispose_mapping(irq_find_mapping(slave->bus->domain, 178 - slave->dev_num)); 179 + sdw_irq_dispose_mapping(slave); 179 180 180 181 mutex_unlock(&slave->sdw_dev_lock); 181 182
+59
drivers/soundwire/irq.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + // Copyright (C) 2023 Cirrus Logic, Inc. and 3 + // Cirrus Logic International Semiconductor Ltd. 4 + 5 + #include <linux/device.h> 6 + #include <linux/fwnode.h> 7 + #include <linux/irq.h> 8 + #include <linux/irqdomain.h> 9 + #include <linux/soundwire/sdw.h> 10 + #include "irq.h" 11 + 12 + static int sdw_irq_map(struct irq_domain *h, unsigned int virq, 13 + irq_hw_number_t hw) 14 + { 15 + struct sdw_bus *bus = h->host_data; 16 + 17 + irq_set_chip_data(virq, bus); 18 + irq_set_chip(virq, &bus->irq_chip); 19 + irq_set_nested_thread(virq, 1); 20 + irq_set_noprobe(virq); 21 + 22 + return 0; 23 + } 24 + 25 + static const struct irq_domain_ops sdw_domain_ops = { 26 + .map = sdw_irq_map, 27 + }; 28 + 29 + int sdw_irq_create(struct sdw_bus *bus, 30 + struct fwnode_handle *fwnode) 31 + { 32 + bus->irq_chip.name = dev_name(bus->dev); 33 + 34 + bus->domain = irq_domain_create_linear(fwnode, SDW_MAX_DEVICES, 35 + &sdw_domain_ops, bus); 36 + if (!bus->domain) { 37 + dev_err(bus->dev, "Failed to add IRQ domain\n"); 38 + return -EINVAL; 39 + } 40 + 41 + return 0; 42 + } 43 + 44 + void sdw_irq_delete(struct sdw_bus *bus) 45 + { 46 + irq_domain_remove(bus->domain); 47 + } 48 + 49 + void sdw_irq_create_mapping(struct sdw_slave *slave) 50 + { 51 + slave->irq = irq_create_mapping(slave->bus->domain, slave->dev_num); 52 + if (!slave->irq) 53 + dev_warn(&slave->dev, "Failed to map IRQ\n"); 54 + } 55 + 56 + void sdw_irq_dispose_mapping(struct sdw_slave *slave) 57 + { 58 + irq_dispose_mapping(irq_find_mapping(slave->bus->domain, slave->dev_num)); 59 + }
+43
drivers/soundwire/irq.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * Copyright (C) 2023 Cirrus Logic, Inc. and 4 + * Cirrus Logic International Semiconductor Ltd. 5 + */ 6 + 7 + #ifndef __SDW_IRQ_H 8 + #define __SDW_IRQ_H 9 + 10 + #include <linux/soundwire/sdw.h> 11 + #include <linux/fwnode.h> 12 + 13 + #if IS_ENABLED(CONFIG_IRQ_DOMAIN) 14 + 15 + int sdw_irq_create(struct sdw_bus *bus, 16 + struct fwnode_handle *fwnode); 17 + void sdw_irq_delete(struct sdw_bus *bus); 18 + void sdw_irq_create_mapping(struct sdw_slave *slave); 19 + void sdw_irq_dispose_mapping(struct sdw_slave *slave); 20 + 21 + #else /* CONFIG_IRQ_DOMAIN */ 22 + 23 + static inline int sdw_irq_create(struct sdw_bus *bus, 24 + struct fwnode_handle *fwnode) 25 + { 26 + return 0; 27 + } 28 + 29 + static inline void sdw_irq_delete(struct sdw_bus *bus) 30 + { 31 + } 32 + 33 + static inline void sdw_irq_create_mapping(struct sdw_slave *slave) 34 + { 35 + } 36 + 37 + static inline void sdw_irq_dispose_mapping(struct sdw_slave *slave) 38 + { 39 + } 40 + 41 + #endif /* CONFIG_IRQ_DOMAIN */ 42 + 43 + #endif /* __SDW_IRQ_H */