Merge tag '5.2-rc-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6
[linux-2.6-microblaze.git] / drivers / mfd / intel_soc_pmic_crc.c
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 };