0001
0002
0003
0004
0005
0006
0007 #include <linux/gpio/driver.h>
0008 #include <linux/interrupt.h>
0009 #include <linux/kernel.h>
0010 #include <linux/module.h>
0011 #include <linux/of_device.h>
0012 #include <linux/platform_device.h>
0013 #include <linux/regmap.h>
0014
0015
0016 #define SPRD_PMIC_EIC_DATA 0x0
0017 #define SPRD_PMIC_EIC_DMSK 0x4
0018 #define SPRD_PMIC_EIC_IEV 0x14
0019 #define SPRD_PMIC_EIC_IE 0x18
0020 #define SPRD_PMIC_EIC_RIS 0x1c
0021 #define SPRD_PMIC_EIC_MIS 0x20
0022 #define SPRD_PMIC_EIC_IC 0x24
0023 #define SPRD_PMIC_EIC_TRIG 0x28
0024 #define SPRD_PMIC_EIC_CTRL0 0x40
0025
0026
0027
0028
0029
0030 #define SPRD_PMIC_EIC_PER_BANK_NR 16
0031 #define SPRD_PMIC_EIC_NR SPRD_PMIC_EIC_PER_BANK_NR
0032 #define SPRD_PMIC_EIC_DATA_MASK GENMASK(15, 0)
0033 #define SPRD_PMIC_EIC_BIT(x) ((x) & (SPRD_PMIC_EIC_PER_BANK_NR - 1))
0034 #define SPRD_PMIC_EIC_DBNC_MASK GENMASK(11, 0)
0035
0036
0037
0038
0039
0040 enum {
0041 REG_IEV,
0042 REG_IE,
0043 REG_TRIG,
0044 CACHE_NR_REGS
0045 };
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057 struct sprd_pmic_eic {
0058 struct gpio_chip chip;
0059 struct irq_chip intc;
0060 struct regmap *map;
0061 u32 offset;
0062 u8 reg[CACHE_NR_REGS];
0063 struct mutex buslock;
0064 int irq;
0065 };
0066
0067 static void sprd_pmic_eic_update(struct gpio_chip *chip, unsigned int offset,
0068 u16 reg, unsigned int val)
0069 {
0070 struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
0071 u32 shift = SPRD_PMIC_EIC_BIT(offset);
0072
0073 regmap_update_bits(pmic_eic->map, pmic_eic->offset + reg,
0074 BIT(shift), val << shift);
0075 }
0076
0077 static int sprd_pmic_eic_read(struct gpio_chip *chip, unsigned int offset,
0078 u16 reg)
0079 {
0080 struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
0081 u32 value;
0082 int ret;
0083
0084 ret = regmap_read(pmic_eic->map, pmic_eic->offset + reg, &value);
0085 if (ret)
0086 return ret;
0087
0088 return !!(value & BIT(SPRD_PMIC_EIC_BIT(offset)));
0089 }
0090
0091 static int sprd_pmic_eic_request(struct gpio_chip *chip, unsigned int offset)
0092 {
0093 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_DMSK, 1);
0094 return 0;
0095 }
0096
0097 static void sprd_pmic_eic_free(struct gpio_chip *chip, unsigned int offset)
0098 {
0099 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_DMSK, 0);
0100 }
0101
0102 static int sprd_pmic_eic_get(struct gpio_chip *chip, unsigned int offset)
0103 {
0104 return sprd_pmic_eic_read(chip, offset, SPRD_PMIC_EIC_DATA);
0105 }
0106
0107 static int sprd_pmic_eic_direction_input(struct gpio_chip *chip,
0108 unsigned int offset)
0109 {
0110
0111 return 0;
0112 }
0113
0114 static void sprd_pmic_eic_set(struct gpio_chip *chip, unsigned int offset,
0115 int value)
0116 {
0117
0118 }
0119
0120 static int sprd_pmic_eic_set_debounce(struct gpio_chip *chip,
0121 unsigned int offset,
0122 unsigned int debounce)
0123 {
0124 struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
0125 u32 reg, value;
0126 int ret;
0127
0128 reg = SPRD_PMIC_EIC_CTRL0 + SPRD_PMIC_EIC_BIT(offset) * 0x4;
0129 ret = regmap_read(pmic_eic->map, pmic_eic->offset + reg, &value);
0130 if (ret)
0131 return ret;
0132
0133 value &= ~SPRD_PMIC_EIC_DBNC_MASK;
0134 value |= (debounce / 1000) & SPRD_PMIC_EIC_DBNC_MASK;
0135 return regmap_write(pmic_eic->map, pmic_eic->offset + reg, value);
0136 }
0137
0138 static int sprd_pmic_eic_set_config(struct gpio_chip *chip, unsigned int offset,
0139 unsigned long config)
0140 {
0141 unsigned long param = pinconf_to_config_param(config);
0142 u32 arg = pinconf_to_config_argument(config);
0143
0144 if (param == PIN_CONFIG_INPUT_DEBOUNCE)
0145 return sprd_pmic_eic_set_debounce(chip, offset, arg);
0146
0147 return -ENOTSUPP;
0148 }
0149
0150 static void sprd_pmic_eic_irq_mask(struct irq_data *data)
0151 {
0152 struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
0153 struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
0154
0155 pmic_eic->reg[REG_IE] = 0;
0156 pmic_eic->reg[REG_TRIG] = 0;
0157 }
0158
0159 static void sprd_pmic_eic_irq_unmask(struct irq_data *data)
0160 {
0161 struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
0162 struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
0163
0164 pmic_eic->reg[REG_IE] = 1;
0165 pmic_eic->reg[REG_TRIG] = 1;
0166 }
0167
0168 static int sprd_pmic_eic_irq_set_type(struct irq_data *data,
0169 unsigned int flow_type)
0170 {
0171 struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
0172 struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
0173
0174 switch (flow_type) {
0175 case IRQ_TYPE_LEVEL_HIGH:
0176 pmic_eic->reg[REG_IEV] = 1;
0177 break;
0178 case IRQ_TYPE_LEVEL_LOW:
0179 pmic_eic->reg[REG_IEV] = 0;
0180 break;
0181 case IRQ_TYPE_EDGE_RISING:
0182 case IRQ_TYPE_EDGE_FALLING:
0183 case IRQ_TYPE_EDGE_BOTH:
0184
0185
0186
0187
0188 break;
0189 default:
0190 return -ENOTSUPP;
0191 }
0192
0193 return 0;
0194 }
0195
0196 static void sprd_pmic_eic_bus_lock(struct irq_data *data)
0197 {
0198 struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
0199 struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
0200
0201 mutex_lock(&pmic_eic->buslock);
0202 }
0203
0204 static void sprd_pmic_eic_bus_sync_unlock(struct irq_data *data)
0205 {
0206 struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
0207 struct sprd_pmic_eic *pmic_eic = gpiochip_get_data(chip);
0208 u32 trigger = irqd_get_trigger_type(data);
0209 u32 offset = irqd_to_hwirq(data);
0210 int state;
0211
0212
0213 if (trigger & IRQ_TYPE_EDGE_BOTH) {
0214 state = sprd_pmic_eic_get(chip, offset);
0215 if (state)
0216 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 0);
0217 else
0218 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 1);
0219 } else {
0220 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV,
0221 pmic_eic->reg[REG_IEV]);
0222 }
0223
0224
0225 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IE,
0226 pmic_eic->reg[REG_IE]);
0227
0228 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_TRIG,
0229 pmic_eic->reg[REG_TRIG]);
0230
0231 mutex_unlock(&pmic_eic->buslock);
0232 }
0233
0234 static void sprd_pmic_eic_toggle_trigger(struct gpio_chip *chip,
0235 unsigned int irq, unsigned int offset)
0236 {
0237 u32 trigger = irq_get_trigger_type(irq);
0238 int state, post_state;
0239
0240 if (!(trigger & IRQ_TYPE_EDGE_BOTH))
0241 return;
0242
0243 state = sprd_pmic_eic_get(chip, offset);
0244 retry:
0245 if (state)
0246 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 0);
0247 else
0248 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IEV, 1);
0249
0250 post_state = sprd_pmic_eic_get(chip, offset);
0251 if (state != post_state) {
0252 dev_warn(chip->parent, "PMIC EIC level was changed.\n");
0253 state = post_state;
0254 goto retry;
0255 }
0256
0257
0258 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_IE, 1);
0259
0260 sprd_pmic_eic_update(chip, offset, SPRD_PMIC_EIC_TRIG, 1);
0261 }
0262
0263 static irqreturn_t sprd_pmic_eic_irq_handler(int irq, void *data)
0264 {
0265 struct sprd_pmic_eic *pmic_eic = data;
0266 struct gpio_chip *chip = &pmic_eic->chip;
0267 unsigned long status;
0268 u32 n, girq, val;
0269 int ret;
0270
0271 ret = regmap_read(pmic_eic->map, pmic_eic->offset + SPRD_PMIC_EIC_MIS,
0272 &val);
0273 if (ret)
0274 return IRQ_RETVAL(ret);
0275
0276 status = val & SPRD_PMIC_EIC_DATA_MASK;
0277
0278 for_each_set_bit(n, &status, chip->ngpio) {
0279
0280 sprd_pmic_eic_update(chip, n, SPRD_PMIC_EIC_IC, 1);
0281
0282 girq = irq_find_mapping(chip->irq.domain, n);
0283 handle_nested_irq(girq);
0284
0285
0286
0287
0288
0289 sprd_pmic_eic_toggle_trigger(chip, girq, n);
0290 }
0291
0292 return IRQ_HANDLED;
0293 }
0294
0295 static int sprd_pmic_eic_probe(struct platform_device *pdev)
0296 {
0297 struct gpio_irq_chip *irq;
0298 struct sprd_pmic_eic *pmic_eic;
0299 int ret;
0300
0301 pmic_eic = devm_kzalloc(&pdev->dev, sizeof(*pmic_eic), GFP_KERNEL);
0302 if (!pmic_eic)
0303 return -ENOMEM;
0304
0305 mutex_init(&pmic_eic->buslock);
0306
0307 pmic_eic->irq = platform_get_irq(pdev, 0);
0308 if (pmic_eic->irq < 0)
0309 return pmic_eic->irq;
0310
0311 pmic_eic->map = dev_get_regmap(pdev->dev.parent, NULL);
0312 if (!pmic_eic->map)
0313 return -ENODEV;
0314
0315 ret = of_property_read_u32(pdev->dev.of_node, "reg", &pmic_eic->offset);
0316 if (ret) {
0317 dev_err(&pdev->dev, "Failed to get PMIC EIC base address.\n");
0318 return ret;
0319 }
0320
0321 ret = devm_request_threaded_irq(&pdev->dev, pmic_eic->irq, NULL,
0322 sprd_pmic_eic_irq_handler,
0323 IRQF_ONESHOT | IRQF_NO_SUSPEND,
0324 dev_name(&pdev->dev), pmic_eic);
0325 if (ret) {
0326 dev_err(&pdev->dev, "Failed to request PMIC EIC IRQ.\n");
0327 return ret;
0328 }
0329
0330 pmic_eic->chip.label = dev_name(&pdev->dev);
0331 pmic_eic->chip.ngpio = SPRD_PMIC_EIC_NR;
0332 pmic_eic->chip.base = -1;
0333 pmic_eic->chip.parent = &pdev->dev;
0334 pmic_eic->chip.direction_input = sprd_pmic_eic_direction_input;
0335 pmic_eic->chip.request = sprd_pmic_eic_request;
0336 pmic_eic->chip.free = sprd_pmic_eic_free;
0337 pmic_eic->chip.set_config = sprd_pmic_eic_set_config;
0338 pmic_eic->chip.set = sprd_pmic_eic_set;
0339 pmic_eic->chip.get = sprd_pmic_eic_get;
0340
0341 pmic_eic->intc.name = dev_name(&pdev->dev);
0342 pmic_eic->intc.irq_mask = sprd_pmic_eic_irq_mask;
0343 pmic_eic->intc.irq_unmask = sprd_pmic_eic_irq_unmask;
0344 pmic_eic->intc.irq_set_type = sprd_pmic_eic_irq_set_type;
0345 pmic_eic->intc.irq_bus_lock = sprd_pmic_eic_bus_lock;
0346 pmic_eic->intc.irq_bus_sync_unlock = sprd_pmic_eic_bus_sync_unlock;
0347 pmic_eic->intc.flags = IRQCHIP_SKIP_SET_WAKE;
0348
0349 irq = &pmic_eic->chip.irq;
0350 irq->chip = &pmic_eic->intc;
0351 irq->threaded = true;
0352
0353 ret = devm_gpiochip_add_data(&pdev->dev, &pmic_eic->chip, pmic_eic);
0354 if (ret < 0) {
0355 dev_err(&pdev->dev, "Could not register gpiochip %d.\n", ret);
0356 return ret;
0357 }
0358
0359 platform_set_drvdata(pdev, pmic_eic);
0360 return 0;
0361 }
0362
0363 static const struct of_device_id sprd_pmic_eic_of_match[] = {
0364 { .compatible = "sprd,sc2731-eic", },
0365 { }
0366 };
0367 MODULE_DEVICE_TABLE(of, sprd_pmic_eic_of_match);
0368
0369 static struct platform_driver sprd_pmic_eic_driver = {
0370 .probe = sprd_pmic_eic_probe,
0371 .driver = {
0372 .name = "sprd-pmic-eic",
0373 .of_match_table = sprd_pmic_eic_of_match,
0374 },
0375 };
0376
0377 module_platform_driver(sprd_pmic_eic_driver);
0378
0379 MODULE_DESCRIPTION("Spreadtrum PMIC EIC driver");
0380 MODULE_LICENSE("GPL v2");