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