| /* |
| * 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, |
| }; |