Lines Matching +full:designware +full:- +full:i2c
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Intel Quark MFD PCI driver for I2C & GPIO
7 * Intel Quark PCI device for I2C and GPIO controller sharing the same
17 #include <linux/clk-provider.h>
19 #include <linux/platform_data/gpio-dwapb.h>
20 #include <linux/platform_data/i2c-designware.h>
33 /* The default number of South-Cluster GPIO on Quark. */
36 /* The DesignWare GPIO ports on Quark. */
44 /* The Quark I2C controller source clock */
101 .name = "gpio-dwapb",
134 quark_mfd->i2c_clk = i2c_clk; in intel_quark_register_i2c_clk()
135 quark_mfd->i2c_clk_lookup = clkdev_create(i2c_clk, NULL, in intel_quark_register_i2c_clk()
138 if (!quark_mfd->i2c_clk_lookup) { in intel_quark_register_i2c_clk()
139 clk_unregister(quark_mfd->i2c_clk); in intel_quark_register_i2c_clk()
141 return -ENOMEM; in intel_quark_register_i2c_clk()
151 if (!quark_mfd->i2c_clk_lookup) in intel_quark_unregister_i2c_clk()
154 clkdev_drop(quark_mfd->i2c_clk_lookup); in intel_quark_unregister_i2c_clk()
155 clk_unregister(quark_mfd->i2c_clk); in intel_quark_unregister_i2c_clk()
162 struct resource *res = (struct resource *)cell->resources; in intel_quark_i2c_setup()
163 struct device *dev = &pdev->dev; in intel_quark_i2c_setup()
170 res[INTEL_QUARK_IORES_IRQ].start = pdev->irq; in intel_quark_i2c_setup()
171 res[INTEL_QUARK_IORES_IRQ].end = pdev->irq; in intel_quark_i2c_setup()
175 return -ENOMEM; in intel_quark_i2c_setup()
178 pdata->i2c_scl_freq = 100000; in intel_quark_i2c_setup()
182 pdata->i2c_scl_freq = (uintptr_t)dmi_id->driver_data; in intel_quark_i2c_setup()
184 cell->platform_data = pdata; in intel_quark_i2c_setup()
185 cell->pdata_size = sizeof(*pdata); in intel_quark_i2c_setup()
193 struct resource *res = (struct resource *)cell->resources; in intel_quark_gpio_setup()
194 struct device *dev = &pdev->dev; in intel_quark_gpio_setup()
203 return -ENOMEM; in intel_quark_gpio_setup()
206 pdata->nports = INTEL_QUARK_GPIO_NPORTS; in intel_quark_gpio_setup()
207 pdata->properties = devm_kcalloc(dev, pdata->nports, in intel_quark_gpio_setup()
208 sizeof(*pdata->properties), in intel_quark_gpio_setup()
210 if (!pdata->properties) in intel_quark_gpio_setup()
211 return -ENOMEM; in intel_quark_gpio_setup()
214 pdata->properties->fwnode = NULL; in intel_quark_gpio_setup()
215 pdata->properties->idx = 0; in intel_quark_gpio_setup()
216 pdata->properties->ngpio = INTEL_QUARK_MFD_NGPIO; in intel_quark_gpio_setup()
217 pdata->properties->gpio_base = INTEL_QUARK_MFD_GPIO_BASE; in intel_quark_gpio_setup()
218 pdata->properties->irq[0] = pdev->irq; in intel_quark_gpio_setup()
219 pdata->properties->irq_shared = true; in intel_quark_gpio_setup()
221 cell->platform_data = pdata; in intel_quark_gpio_setup()
222 cell->pdata_size = sizeof(*pdata); in intel_quark_gpio_setup()
237 quark_mfd = devm_kzalloc(&pdev->dev, sizeof(*quark_mfd), GFP_KERNEL); in intel_quark_mfd_probe()
239 return -ENOMEM; in intel_quark_mfd_probe()
241 quark_mfd->dev = &pdev->dev; in intel_quark_mfd_probe()
242 dev_set_drvdata(&pdev->dev, quark_mfd); in intel_quark_mfd_probe()
244 ret = intel_quark_register_i2c_clk(&pdev->dev); in intel_quark_mfd_probe()
256 ret = mfd_add_devices(&pdev->dev, 0, intel_quark_mfd_cells, in intel_quark_mfd_probe()
265 intel_quark_unregister_i2c_clk(&pdev->dev); in intel_quark_mfd_probe()
271 intel_quark_unregister_i2c_clk(&pdev->dev); in intel_quark_mfd_remove()
272 mfd_remove_devices(&pdev->dev); in intel_quark_mfd_remove()
285 MODULE_DESCRIPTION("Intel Quark MFD PCI driver for I2C & GPIO");