1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Device access for Crystal Cove PMIC 4 * 5 * Copyright (C) 2013, 2014 Intel Corporation. All rights reserved. 6 * 7 * Author: Yang, Bin <bin.yang@intel.com> 8 * Author: Zhu, Lejun <lejun.zhu@linux.intel.com> 9 */ 10 11 #include <linux/interrupt.h> 12 #include <linux/regmap.h> 13 #include <linux/mfd/core.h> 14 #include <linux/mfd/intel_soc_pmic.h> 15 16 #include "intel_soc_pmic_core.h" 17 18 #define CRYSTAL_COVE_MAX_REGISTER 0xC6 19 20 #define CRYSTAL_COVE_REG_IRQLVL1 0x02 21 #define CRYSTAL_COVE_REG_MIRQLVL1 0x0E 22 23 #define CRYSTAL_COVE_IRQ_PWRSRC 0 24 #define CRYSTAL_COVE_IRQ_THRM 1 25 #define CRYSTAL_COVE_IRQ_BCU 2 26 #define CRYSTAL_COVE_IRQ_ADC 3 27 #define CRYSTAL_COVE_IRQ_CHGR 4 28 #define CRYSTAL_COVE_IRQ_GPIO 5 29 #define CRYSTAL_COVE_IRQ_VHDMIOCP 6 30 31 static struct resource gpio_resources[] = { 32 DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_GPIO, "GPIO"), 33 }; 34 35 static struct resource pwrsrc_resources[] = { 36 DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_PWRSRC, "PWRSRC"), 37 }; 38 39 static struct resource adc_resources[] = { 40 DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_ADC, "ADC"), 41 }; 42 43 static struct resource thermal_resources[] = { 44 DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_THRM, "THERMAL"), 45 }; 46 47 static struct resource bcu_resources[] = { 48 DEFINE_RES_IRQ_NAMED(CRYSTAL_COVE_IRQ_BCU, "BCU"), 49 }; 50 51 static struct mfd_cell crystal_cove_byt_dev[] = { 52 { 53 .name = "crystal_cove_pwrsrc", 54 .num_resources = ARRAY_SIZE(pwrsrc_resources), 55 .resources = pwrsrc_resources, 56 }, 57 { 58 .name = "crystal_cove_adc", 59 .num_resources = ARRAY_SIZE(adc_resources), 60 .resources = adc_resources, 61 }, 62 { 63 .name = "crystal_cove_thermal", 64 .num_resources = ARRAY_SIZE(thermal_resources), 65 .resources = thermal_resources, 66 }, 67 { 68 .name = "crystal_cove_bcu", 69 .num_resources = ARRAY_SIZE(bcu_resources), 70 .resources = bcu_resources, 71 }, 72 { 73 .name = "crystal_cove_gpio", 74 .num_resources = ARRAY_SIZE(gpio_resources), 75 .resources = gpio_resources, 76 }, 77 { 78 .name = "crystal_cove_pmic", 79 }, 80 { 81 .name = "crystal_cove_pwm", 82 }, 83 }; 84 85 static struct mfd_cell crystal_cove_cht_dev[] = { 86 { 87 .name = "crystal_cove_gpio", 88 .num_resources = ARRAY_SIZE(gpio_resources), 89 .resources = gpio_resources, 90 }, 91 { 92 .name = "crystal_cove_pwm", 93 }, 94 }; 95 96 static const struct regmap_config crystal_cove_regmap_config = { 97 .reg_bits = 8, 98 .val_bits = 8, 99 100 .max_register = CRYSTAL_COVE_MAX_REGISTER, 101 .cache_type = REGCACHE_NONE, 102 }; 103 104 static const struct regmap_irq crystal_cove_irqs[] = { 105 REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_PWRSRC, 0, BIT(CRYSTAL_COVE_IRQ_PWRSRC)), 106 REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_THRM, 0, BIT(CRYSTAL_COVE_IRQ_THRM)), 107 REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_BCU, 0, BIT(CRYSTAL_COVE_IRQ_BCU)), 108 REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_ADC, 0, BIT(CRYSTAL_COVE_IRQ_ADC)), 109 REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_CHGR, 0, BIT(CRYSTAL_COVE_IRQ_CHGR)), 110 REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_GPIO, 0, BIT(CRYSTAL_COVE_IRQ_GPIO)), 111 REGMAP_IRQ_REG(CRYSTAL_COVE_IRQ_VHDMIOCP, 0, BIT(CRYSTAL_COVE_IRQ_VHDMIOCP)), 112 }; 113 114 static const struct regmap_irq_chip crystal_cove_irq_chip = { 115 .name = "Crystal Cove", 116 .irqs = crystal_cove_irqs, 117 .num_irqs = ARRAY_SIZE(crystal_cove_irqs), 118 .num_regs = 1, 119 .status_base = CRYSTAL_COVE_REG_IRQLVL1, 120 .mask_base = CRYSTAL_COVE_REG_MIRQLVL1, 121 }; 122 123 struct intel_soc_pmic_config intel_soc_pmic_config_byt_crc = { 124 .irq_flags = IRQF_TRIGGER_RISING, 125 .cell_dev = crystal_cove_byt_dev, 126 .n_cell_devs = ARRAY_SIZE(crystal_cove_byt_dev), 127 .regmap_config = &crystal_cove_regmap_config, 128 .irq_chip = &crystal_cove_irq_chip, 129 }; 130 131 struct intel_soc_pmic_config intel_soc_pmic_config_cht_crc = { 132 .irq_flags = IRQF_TRIGGER_RISING, 133 .cell_dev = crystal_cove_cht_dev, 134 .n_cell_devs = ARRAY_SIZE(crystal_cove_cht_dev), 135 .regmap_config = &crystal_cove_regmap_config, 136 .irq_chip = &crystal_cove_irq_chip, 137 }; 138