Lines Matching full:cpcap
2 * Motorola CPCAP PMIC core driver
21 #include <linux/mfd/motorola-cpcap.h>
63 static int cpcap_check_revision(struct cpcap_ddata *cpcap) in cpcap_check_revision() argument
68 ret = cpcap_get_vendor(&cpcap->spi->dev, cpcap->regmap, &vendor); in cpcap_check_revision()
72 ret = cpcap_get_revision(&cpcap->spi->dev, cpcap->regmap, &rev); in cpcap_check_revision()
76 dev_info(&cpcap->spi->dev, "CPCAP vendor: %s rev: %i.%i (%x)\n", in cpcap_check_revision()
82 dev_info(&cpcap->spi->dev, in cpcap_check_revision()
83 "Please add old CPCAP revision support as needed\n"); in cpcap_check_revision()
96 .name = "cpcap-m2",
105 .name = "cpcap-m2",
124 static void cpcap_init_one_regmap_irq(struct cpcap_ddata *cpcap, in cpcap_init_one_regmap_irq() argument
132 reg_offset /= cpcap->regmap_conf->val_bits; in cpcap_init_one_regmap_irq()
133 reg_offset *= cpcap->regmap_conf->reg_stride; in cpcap_init_one_regmap_irq()
135 bit = irq % cpcap->regmap_conf->val_bits; in cpcap_init_one_regmap_irq()
142 static int cpcap_init_irq_chip(struct cpcap_ddata *cpcap, int irq_chip, in cpcap_init_irq_chip() argument
149 struct regmap_irq *rirq = &cpcap->irqs[i]; in cpcap_init_irq_chip()
151 cpcap_init_one_regmap_irq(cpcap, rirq, irq_start, i); in cpcap_init_irq_chip()
153 chip->irqs = &cpcap->irqs[irq_start]; in cpcap_init_irq_chip()
155 chip->irq_drv_data = cpcap; in cpcap_init_irq_chip()
157 ret = devm_regmap_add_irq_chip(&cpcap->spi->dev, cpcap->regmap, in cpcap_init_irq_chip()
158 cpcap->spi->irq, in cpcap_init_irq_chip()
159 irq_get_trigger_type(cpcap->spi->irq) | in cpcap_init_irq_chip()
161 chip, &cpcap->irqdata[irq_chip]); in cpcap_init_irq_chip()
163 dev_err(&cpcap->spi->dev, "could not add irq chip %i: %i\n", in cpcap_init_irq_chip()
171 static int cpcap_init_irq(struct cpcap_ddata *cpcap) in cpcap_init_irq() argument
175 cpcap->irqs = devm_kzalloc(&cpcap->spi->dev, in cpcap_init_irq()
176 array3_size(sizeof(*cpcap->irqs), in cpcap_init_irq()
178 cpcap->regmap_conf->val_bits), in cpcap_init_irq()
180 if (!cpcap->irqs) in cpcap_init_irq()
183 ret = cpcap_init_irq_chip(cpcap, 0, 0, 16); in cpcap_init_irq()
187 ret = cpcap_init_irq_chip(cpcap, 1, 16, 16); in cpcap_init_irq()
191 ret = cpcap_init_irq_chip(cpcap, 2, 32, 64); in cpcap_init_irq()
195 enable_irq_wake(cpcap->spi->irq); in cpcap_init_irq()
201 { .compatible = "motorola,cpcap", },
222 struct cpcap_ddata *cpcap; in cpcap_probe() local
229 cpcap = devm_kzalloc(&spi->dev, sizeof(*cpcap), GFP_KERNEL); in cpcap_probe()
230 if (!cpcap) in cpcap_probe()
233 cpcap->spi = spi; in cpcap_probe()
234 spi_set_drvdata(spi, cpcap); in cpcap_probe()
243 cpcap->regmap_conf = &cpcap_regmap_config; in cpcap_probe()
244 cpcap->regmap = devm_regmap_init_spi(spi, &cpcap_regmap_config); in cpcap_probe()
245 if (IS_ERR(cpcap->regmap)) { in cpcap_probe()
246 ret = PTR_ERR(cpcap->regmap); in cpcap_probe()
247 dev_err(&cpcap->spi->dev, "Failed to initialize regmap: %d\n", in cpcap_probe()
253 ret = cpcap_check_revision(cpcap); in cpcap_probe()
255 dev_err(&cpcap->spi->dev, "Failed to detect CPCAP: %i\n", ret); in cpcap_probe()
259 ret = cpcap_init_irq(cpcap); in cpcap_probe()
263 return devm_of_platform_populate(&cpcap->spi->dev); in cpcap_probe()
268 .name = "cpcap-core",
275 MODULE_ALIAS("platform:cpcap");
276 MODULE_DESCRIPTION("CPCAP driver");