| /* | |
| * intel_soc_pmic_crc.c - Device access for Crystal Cove PMIC | |
| * | |
| * Copyright (C) 2013, 2014 Intel Corporation. All rights reserved. | |
| * | |
| * This program is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU General Public License version | |
| * 2 as published by the Free Software Foundation. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| * Author: Yang, Bin <bin.yang@intel.com> | |
| * Author: Zhu, Lejun <lejun.zhu@linux.intel.com> | |
| */ | |
| #include <linux/mfd/core.h> | |
| #include <linux/interrupt.h> | |
| #include <linux/regmap.h> | |
| #include <linux/mfd/intel_soc_pmic.h> | |
| #include "intel_soc_pmic_core.h" | |
| #define CRYSTAL_COVE_MAX_REGISTER 0xC6 | |
| #define CRYSTAL_COVE_REG_IRQLVL1 0x02 | |
| #define CRYSTAL_COVE_REG_MIRQLVL1 0x0E | |
| #define CRYSTAL_COVE_IRQ_PWRSRC 0 | |
| #define CRYSTAL_COVE_IRQ_THRM 1 | |
| #define CRYSTAL_COVE_IRQ_BCU 2 | |
| #define CRYSTAL_COVE_IRQ_ADC 3 | |
| #define CRYSTAL_COVE_IRQ_CHGR 4 | |
| #define CRYSTAL_COVE_IRQ_GPIO 5 | |
| #define CRYSTAL_COVE_IRQ_VHDMIOCP 6 | |
| static struct resource gpio_resources[] = { | |
| { | |
| .name = "GPIO", | |
| .start = CRYSTAL_COVE_IRQ_GPIO, | |
| .end = CRYSTAL_COVE_IRQ_GPIO, | |
| .flags = IORESOURCE_IRQ, | |
| }, | |
| }; | |
| static struct resource pwrsrc_resources[] = { | |
| { | |
| .name = "PWRSRC", | |
| .start = CRYSTAL_COVE_IRQ_PWRSRC, | |
| .end = CRYSTAL_COVE_IRQ_PWRSRC, | |
| .flags = IORESOURCE_IRQ, | |
| }, | |
| }; | |
| static struct resource adc_resources[] = { | |
| { | |
| .name = "ADC", | |
| .start = CRYSTAL_COVE_IRQ_ADC, | |
| .end = CRYSTAL_COVE_IRQ_ADC, | |
| .flags = IORESOURCE_IRQ, | |
| }, | |
| }; | |
| static struct resource thermal_resources[] = { | |
| { | |
| .name = "THERMAL", | |
| .start = CRYSTAL_COVE_IRQ_THRM, | |
| .end = CRYSTAL_COVE_IRQ_THRM, | |
| .flags = IORESOURCE_IRQ, | |
| }, | |
| }; | |
| static struct resource bcu_resources[] = { | |
| { | |
| .name = "BCU", | |
| .start = CRYSTAL_COVE_IRQ_BCU, | |
| .end = CRYSTAL_COVE_IRQ_BCU, | |
| .flags = IORESOURCE_IRQ, | |
| }, | |
| }; | |
| static struct mfd_cell crystal_cove_dev[] = { | |
| { | |
| .name = "crystal_cove_pwrsrc", | |
| .num_resources = ARRAY_SIZE(pwrsrc_resources), | |
| .resources = pwrsrc_resources, | |
| }, | |
| { | |
| .name = "crystal_cove_adc", | |
| .num_resources = ARRAY_SIZE(adc_resources), | |
| .resources = adc_resources, | |
| }, | |
| { | |
| .name = "crystal_cove_thermal", | |
| .num_resources = ARRAY_SIZE(thermal_resources), | |
| .resources = thermal_resources, | |
| }, | |
| { | |
| .name = "crystal_cove_bcu", | |
| .num_resources = ARRAY_SIZE(bcu_resources), | |
| .resources = bcu_resources, | |
| }, | |
| { | |
| .name = "crystal_cove_gpio", | |
| .num_resources = ARRAY_SIZE(gpio_resources), | |
| .resources = gpio_resources, | |
| }, | |
| { | |
| .name = "crystal_cove_pmic", | |
| }, | |
| { | |
| .name = "crystal_cove_pwm", | |
| }, | |
| }; | |
| static const struct regmap_config crystal_cove_regmap_config = { | |
| .reg_bits = 8, | |
| .val_bits = 8, | |
| .max_register = CRYSTAL_COVE_MAX_REGISTER, | |
| .cache_type = REGCACHE_NONE, | |
| }; | |
| static const struct regmap_irq crystal_cove_irqs[] = { | |
| [CRYSTAL_COVE_IRQ_PWRSRC] = { | |
| .mask = BIT(CRYSTAL_COVE_IRQ_PWRSRC), | |
| }, | |
| [CRYSTAL_COVE_IRQ_THRM] = { | |
| .mask = BIT(CRYSTAL_COVE_IRQ_THRM), | |
| }, | |
| [CRYSTAL_COVE_IRQ_BCU] = { | |
| .mask = BIT(CRYSTAL_COVE_IRQ_BCU), | |
| }, | |
| [CRYSTAL_COVE_IRQ_ADC] = { | |
| .mask = BIT(CRYSTAL_COVE_IRQ_ADC), | |
| }, | |
| [CRYSTAL_COVE_IRQ_CHGR] = { | |
| .mask = BIT(CRYSTAL_COVE_IRQ_CHGR), | |
| }, | |
| [CRYSTAL_COVE_IRQ_GPIO] = { | |
| .mask = BIT(CRYSTAL_COVE_IRQ_GPIO), | |
| }, | |
| [CRYSTAL_COVE_IRQ_VHDMIOCP] = { | |
| .mask = BIT(CRYSTAL_COVE_IRQ_VHDMIOCP), | |
| }, | |
| }; | |
| static const struct regmap_irq_chip crystal_cove_irq_chip = { | |
| .name = "Crystal Cove", | |
| .irqs = crystal_cove_irqs, | |
| .num_irqs = ARRAY_SIZE(crystal_cove_irqs), | |
| .num_regs = 1, | |
| .status_base = CRYSTAL_COVE_REG_IRQLVL1, | |
| .mask_base = CRYSTAL_COVE_REG_MIRQLVL1, | |
| }; | |
| struct intel_soc_pmic_config intel_soc_pmic_config_crc = { | |
| .irq_flags = IRQF_TRIGGER_RISING, | |
| .cell_dev = crystal_cove_dev, | |
| .n_cell_devs = ARRAY_SIZE(crystal_cove_dev), | |
| .regmap_config = &crystal_cove_regmap_config, | |
| .irq_chip = &crystal_cove_irq_chip, | |
| }; |