Lines Matching +full:i2c +full:- +full:alias
1 // SPDX-License-Identifier: GPL-2.0+
3 * Serial multi-instantiate driver, pseudo driver to instantiate multiple
11 #include <linux/i2c.h>
55 switch (inst->flags & IRQ_RESOURCE_TYPE) { in smi_get_irq()
57 ret = acpi_dev_gpio_irq_get(adev, inst->irq_idx); in smi_get_irq()
59 dev_dbg(&pdev->dev, "Using gpio irq\n"); in smi_get_irq()
62 ret = platform_get_irq(pdev, inst->irq_idx); in smi_get_irq()
64 dev_dbg(&pdev->dev, "Using platform irq\n"); in smi_get_irq()
69 ret = acpi_dev_gpio_irq_get(adev, inst->irq_idx); in smi_get_irq()
72 ret = platform_get_irq(pdev, inst->irq_idx); in smi_get_irq()
78 return dev_err_probe(&pdev->dev, ret, "Error requesting irq at index %d\n", in smi_get_irq()
79 inst->irq_idx); in smi_get_irq()
86 while (smi->i2c_num--) in smi_devs_unregister()
87 i2c_unregister_device(smi->i2c_devs[smi->i2c_num]); in smi_devs_unregister()
89 while (smi->spi_num--) in smi_devs_unregister()
90 spi_unregister_device(smi->spi_devs[smi->spi_num]); in smi_devs_unregister()
94 * smi_spi_probe - Instantiate multiple SPI devices from inst array
104 struct device *dev = &pdev->dev; in smi_spi_probe()
115 return -ENOENT; in smi_spi_probe()
119 smi->spi_devs = devm_kcalloc(dev, count, sizeof(*smi->spi_devs), GFP_KERNEL); in smi_spi_probe()
120 if (!smi->spi_devs) in smi_spi_probe()
121 return -ENOMEM; in smi_spi_probe()
128 dev_name(&adev->dev)); in smi_spi_probe()
132 ctlr = spi_dev->controller; in smi_spi_probe()
134 strscpy(spi_dev->modalias, inst_array[i].type, sizeof(spi_dev->modalias)); in smi_spi_probe()
141 spi_dev->irq = ret; in smi_spi_probe()
143 snprintf(name, sizeof(name), "%s-%s-%s.%d", dev_name(&ctlr->dev), dev_name(dev), in smi_spi_probe()
145 spi_dev->dev.init_name = name; in smi_spi_probe()
149 dev_err_probe(&ctlr->dev, ret, "failed to add SPI device %s from ACPI\n", in smi_spi_probe()
150 dev_name(&adev->dev)); in smi_spi_probe()
158 smi->spi_devs[i] = spi_dev; in smi_spi_probe()
159 smi->spi_num++; in smi_spi_probe()
162 if (smi->spi_num < count) { in smi_spi_probe()
164 ret = -ENODEV; in smi_spi_probe()
168 dev_info(dev, "Instantiated %d SPI devices.\n", smi->spi_num); in smi_spi_probe()
178 * smi_i2c_probe - Instantiate multiple I2C devices from inst array
183 * Returns the number of I2C devices instantiate, Zero if none is found or a negative error code.
189 struct device *dev = &pdev->dev; in smi_i2c_probe()
198 return -ENOENT; in smi_i2c_probe()
202 smi->i2c_devs = devm_kcalloc(dev, count, sizeof(*smi->i2c_devs), GFP_KERNEL); in smi_i2c_probe()
203 if (!smi->i2c_devs) in smi_i2c_probe()
204 return -ENOMEM; in smi_i2c_probe()
209 snprintf(name, sizeof(name), "%s-%s.%d", dev_name(dev), inst_array[i].type, i); in smi_i2c_probe()
217 smi->i2c_devs[i] = i2c_acpi_new_device(dev, i, &board_info); in smi_i2c_probe()
218 if (IS_ERR(smi->i2c_devs[i])) { in smi_i2c_probe()
219 ret = dev_err_probe(dev, PTR_ERR(smi->i2c_devs[i]), in smi_i2c_probe()
220 "Error creating i2c-client, idx %d\n", i); in smi_i2c_probe()
223 smi->i2c_num++; in smi_i2c_probe()
225 if (smi->i2c_num < count) { in smi_i2c_probe()
227 ret = -ENODEV; in smi_i2c_probe()
231 dev_info(dev, "Instantiated %d I2C devices.\n", smi->i2c_num); in smi_i2c_probe()
242 struct device *dev = &pdev->dev; in smi_probe()
250 return -ENODEV; in smi_probe()
255 return -ENOMEM; in smi_probe()
259 switch (node->bus_type) { in smi_probe()
261 return smi_i2c_probe(pdev, smi, node->instances); in smi_probe()
263 return smi_spi_probe(pdev, smi, node->instances); in smi_probe()
266 * For backwards-compatibility with the existing nodes I2C in smi_probe()
267 * is checked first and if such entries are found ONLY I2C in smi_probe()
273 ret = smi_i2c_probe(pdev, smi, node->instances); in smi_probe()
274 if (ret != -ENOENT) in smi_probe()
276 return smi_spi_probe(pdev, smi, node->instances); in smi_probe()
278 return -EINVAL; in smi_probe()
323 { "cs35l41-hda", IRQ_RESOURCE_AUTO, 0 },
324 { "cs35l41-hda", IRQ_RESOURCE_AUTO, 0 },
325 { "cs35l41-hda", IRQ_RESOURCE_AUTO, 0 },
326 { "cs35l41-hda", IRQ_RESOURCE_AUTO, 0 },
334 { "cs35l56-hda", IRQ_RESOURCE_AUTO, 0 },
335 { "cs35l56-hda", IRQ_RESOURCE_AUTO, 0 },
336 { "cs35l56-hda", IRQ_RESOURCE_AUTO, 0 },
337 { "cs35l56-hda", IRQ_RESOURCE_AUTO, 0 },
338 /* a 5th entry is an alias address, not a real device */
339 { "cs35l56-hda_dummy_dev" },
346 * Note new device-ids must also be added to ignore_serial_bus_ids in
355 /* Non-conforming _HID for Cirrus Logic already released */