Lines Matching refs:mc13xxx

17 #include "mc13xxx.h"
49 void mc13xxx_lock(struct mc13xxx *mc13xxx)
51 if (!mutex_trylock(&mc13xxx->lock)) {
52 dev_dbg(mc13xxx->dev, "wait for %s from %ps\n",
55 mutex_lock(&mc13xxx->lock);
57 dev_dbg(mc13xxx->dev, "%s from %ps\n",
62 void mc13xxx_unlock(struct mc13xxx *mc13xxx)
64 dev_dbg(mc13xxx->dev, "%s from %ps\n",
66 mutex_unlock(&mc13xxx->lock);
70 int mc13xxx_reg_read(struct mc13xxx *mc13xxx, unsigned int offset, u32 *val)
74 ret = regmap_read(mc13xxx->regmap, offset, val);
75 dev_vdbg(mc13xxx->dev, "[0x%02x] -> 0x%06x\n", offset, *val);
81 int mc13xxx_reg_write(struct mc13xxx *mc13xxx, unsigned int offset, u32 val)
83 dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x\n", offset, val);
88 return regmap_write(mc13xxx->regmap, offset, val);
92 int mc13xxx_reg_rmw(struct mc13xxx *mc13xxx, unsigned int offset,
96 dev_vdbg(mc13xxx->dev, "[0x%02x] <- 0x%06x (mask: 0x%06x)\n",
99 return regmap_update_bits(mc13xxx->regmap, offset, mask, val);
103 int mc13xxx_irq_mask(struct mc13xxx *mc13xxx, int irq)
105 int virq = regmap_irq_get_virq(mc13xxx->irq_data, irq);
113 int mc13xxx_irq_unmask(struct mc13xxx *mc13xxx, int irq)
115 int virq = regmap_irq_get_virq(mc13xxx->irq_data, irq);
123 int mc13xxx_irq_status(struct mc13xxx *mc13xxx, int irq,
131 if (irq < 0 || irq >= ARRAY_SIZE(mc13xxx->irqs))
137 ret = mc13xxx_reg_read(mc13xxx, offmask, &mask);
147 ret = mc13xxx_reg_read(mc13xxx, offstat, &stat);
158 int mc13xxx_irq_request(struct mc13xxx *mc13xxx, int irq,
161 int virq = regmap_irq_get_virq(mc13xxx->irq_data, irq);
163 return devm_request_threaded_irq(mc13xxx->dev, virq, NULL, handler,
168 int mc13xxx_irq_free(struct mc13xxx *mc13xxx, int irq, void *dev)
170 int virq = regmap_irq_get_virq(mc13xxx->irq_data, irq);
172 devm_free_irq(mc13xxx->dev, virq, dev);
178 static void mc13xxx_print_revision(struct mc13xxx *mc13xxx, u32 revision)
180 dev_info(mc13xxx->dev, "%s: rev: %d.%d, "
182 mc13xxx->variant->name,
191 static void mc34708_print_revision(struct mc13xxx *mc13xxx, u32 revision)
193 dev_info(mc13xxx->dev, "%s: rev %d.%d, fin: %d, fab: %d\n",
194 mc13xxx->variant->name,
201 /* These are only exported for mc13xxx-i2c and mc13xxx-spi */
220 static const char *mc13xxx_get_chipname(struct mc13xxx *mc13xxx)
222 return mc13xxx->variant->name;
225 int mc13xxx_get_flags(struct mc13xxx *mc13xxx)
227 return mc13xxx->flags;
237 struct mc13xxx *mc13xxx;
252 int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
259 .mc13xxx = mc13xxx,
263 dev_dbg(mc13xxx->dev, "%s\n", __func__);
265 mc13xxx_lock(mc13xxx);
267 if (mc13xxx->adcflags & MC13XXX_ADC_WORKING) {
272 mc13xxx->adcflags |= MC13XXX_ADC_WORKING;
274 ret = mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0);
317 mc13xxx_unlock(mc13xxx);
325 dev_dbg(mc13xxx->dev, "%s: request irq\n", __func__);
326 ret = mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_ADCDONE,
331 mc13xxx_reg_write(mc13xxx, MC13XXX_ADC0, adc0);
332 mc13xxx_reg_write(mc13xxx, MC13XXX_ADC1, adc1);
334 mc13xxx_unlock(mc13xxx);
341 mc13xxx_lock(mc13xxx);
343 mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_ADCDONE, &adcdone_data);
347 ret = mc13xxx_reg_read(mc13xxx,
355 mc13xxx_reg_write(mc13xxx, MC13XXX_ADC0, old_adc0);
357 mc13xxx->adcflags &= ~MC13XXX_ADC_WORKING;
359 mc13xxx_unlock(mc13xxx);
365 static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,
369 const char *name = mc13xxx_get_chipname(mc13xxx);
384 return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0,
385 regmap_irq_get_domain(mc13xxx->irq_data));
388 static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format)
390 return mc13xxx_add_subdevice_pdata(mc13xxx, format, NULL, 0);
394 static int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx)
396 struct device_node *np = mc13xxx->dev->of_node;
401 if (of_property_read_bool(np, "fsl,mc13xxx-uses-adc"))
402 mc13xxx->flags |= MC13XXX_USE_ADC;
404 if (of_property_read_bool(np, "fsl,mc13xxx-uses-codec"))
405 mc13xxx->flags |= MC13XXX_USE_CODEC;
407 if (of_property_read_bool(np, "fsl,mc13xxx-uses-rtc"))
408 mc13xxx->flags |= MC13XXX_USE_RTC;
410 if (of_property_read_bool(np, "fsl,mc13xxx-uses-touch"))
411 mc13xxx->flags |= MC13XXX_USE_TOUCHSCREEN;
416 static inline int mc13xxx_probe_flags_dt(struct mc13xxx *mc13xxx)
425 struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
429 mc13xxx->dev = dev;
431 ret = mc13xxx_reg_read(mc13xxx, MC13XXX_REVISION, &revision);
435 mc13xxx->variant->print_revision(mc13xxx, revision);
437 ret = mc13xxx_reg_rmw(mc13xxx, MC13XXX_PWRCTRL,
442 for (i = 0; i < ARRAY_SIZE(mc13xxx->irqs); i++) {
443 mc13xxx->irqs[i].reg_offset = i / MC13XXX_IRQ_PER_REG;
444 mc13xxx->irqs[i].mask = BIT(i % MC13XXX_IRQ_PER_REG);
447 mc13xxx->irq_chip.name = dev_name(dev);
448 mc13xxx->irq_chip.status_base = MC13XXX_IRQSTAT0;
449 mc13xxx->irq_chip.mask_base = MC13XXX_IRQMASK0;
450 mc13xxx->irq_chip.ack_base = MC13XXX_IRQSTAT0;
451 mc13xxx->irq_chip.irq_reg_stride = MC13XXX_IRQSTAT1 - MC13XXX_IRQSTAT0;
452 mc13xxx->irq_chip.init_ack_masked = true;
453 mc13xxx->irq_chip.use_ack = true;
454 mc13xxx->irq_chip.num_regs = MC13XXX_IRQ_REG_CNT;
455 mc13xxx->irq_chip.irqs = mc13xxx->irqs;
456 mc13xxx->irq_chip.num_irqs = ARRAY_SIZE(mc13xxx->irqs);
458 ret = regmap_add_irq_chip(mc13xxx->regmap, mc13xxx->irq, IRQF_ONESHOT,
459 0, &mc13xxx->irq_chip, &mc13xxx->irq_data);
463 mutex_init(&mc13xxx->lock);
465 if (mc13xxx_probe_flags_dt(mc13xxx) < 0 && pdata)
466 mc13xxx->flags = pdata->flags;
469 mc13xxx_add_subdevice_pdata(mc13xxx, "%s-regulator",
471 mc13xxx_add_subdevice_pdata(mc13xxx, "%s-led",
473 mc13xxx_add_subdevice_pdata(mc13xxx, "%s-pwrbutton",
475 if (mc13xxx->flags & MC13XXX_USE_CODEC)
476 mc13xxx_add_subdevice_pdata(mc13xxx, "%s-codec",
478 if (mc13xxx->flags & MC13XXX_USE_TOUCHSCREEN)
479 mc13xxx_add_subdevice_pdata(mc13xxx, "%s-ts",
482 mc13xxx_add_subdevice(mc13xxx, "%s-regulator");
483 mc13xxx_add_subdevice(mc13xxx, "%s-led");
484 mc13xxx_add_subdevice(mc13xxx, "%s-pwrbutton");
485 if (mc13xxx->flags & MC13XXX_USE_CODEC)
486 mc13xxx_add_subdevice(mc13xxx, "%s-codec");
487 if (mc13xxx->flags & MC13XXX_USE_TOUCHSCREEN)
488 mc13xxx_add_subdevice(mc13xxx, "%s-ts");
491 if (mc13xxx->flags & MC13XXX_USE_ADC)
492 mc13xxx_add_subdevice(mc13xxx, "%s-adc");
494 if (mc13xxx->flags & MC13XXX_USE_RTC)
495 mc13xxx_add_subdevice(mc13xxx, "%s-rtc");
503 struct mc13xxx *mc13xxx = dev_get_drvdata(dev);
506 regmap_del_irq_chip(mc13xxx->irq, mc13xxx->irq_data);
507 mutex_destroy(&mc13xxx->lock);