gpio-intel-mid.c 11.4 KB
Newer Older
G
Grant Likely 已提交
1 2 3
/*
 * Moorestown platform Langwell chip GPIO driver
 *
4
 * Copyright (c) 2008, 2009, 2013, Intel Corporation.
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/* Supports:
 * Moorestown platform Langwell chip.
A
Alek Du 已提交
22
 * Medfield platform Penwell chip.
23 24 25 26
 */

#include <linux/module.h>
#include <linux/pci.h>
27
#include <linux/platform_device.h>
28 29 30 31 32 33 34 35
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/stddef.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <linux/gpio.h>
36
#include <linux/slab.h>
37
#include <linux/pm_runtime.h>
38
#include <linux/irqdomain.h>
39

40 41 42
#define LNW_IRQ_TYPE_EDGE	(1 << 0)
#define LNW_IRQ_TYPE_LEVEL	(1 << 1)

A
Alek Du 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
/*
 * Langwell chip has 64 pins and thus there are 2 32bit registers to control
 * each feature, while Penwell chip has 96 pins for each block, and need 3 32bit
 * registers to control them, so we only define the order here instead of a
 * structure, to get a bit offset for a pin (use GPDR as an example):
 *
 * nreg = ngpio / 32;
 * reg = offset / 32;
 * bit = offset % 32;
 * reg_addr = reg_base + GPDR * nreg * 4 + reg * 4;
 *
 * so the bit of reg_addr is to control pin offset's GPDR feature
*/

enum GPIO_REG {
	GPLR = 0,	/* pin level read-only */
	GPDR,		/* pin direction */
	GPSR,		/* pin set */
	GPCR,		/* pin clear */
	GRER,		/* rising edge detect */
	GFER,		/* falling edge detect */
	GEDR,		/* edge detect result */
65
	GAFR,		/* alt function */
66 67
};

68 69 70 71 72 73 74 75 76 77
/* langwell gpio driver data */
struct lnw_gpio_ddata {
	u16 ngpio;		/* number of gpio pins */
	u32 gplr_offset;	/* offset of first GPLR register from base */
	u32 flis_base;		/* base address of FLIS registers */
	u32 flis_len;		/* length of FLIS registers */
	u32 (*get_flis_offset)(int gpio);
	u32 chip_irq_type;	/* chip interrupt type */
};

78 79
struct lnw_gpio {
	struct gpio_chip		chip;
80
	void __iomem			*reg_base;
81
	spinlock_t			lock;
82
	struct pci_dev			*pdev;
83
	struct irq_domain		*domain;
84 85
};

D
David Cohen 已提交
86 87
#define to_lnw_priv(chip)	container_of(chip, struct lnw_gpio, chip)

A
Alek Du 已提交
88
static void __iomem *gpio_reg(struct gpio_chip *chip, unsigned offset,
89
			      enum GPIO_REG reg_type)
90
{
D
David Cohen 已提交
91
	struct lnw_gpio *lnw = to_lnw_priv(chip);
A
Alek Du 已提交
92
	unsigned nreg = chip->ngpio / 32;
93
	u8 reg = offset / 32;
A
Alek Du 已提交
94

95
	return lnw->reg_base + reg_type * nreg * 4 + reg * 4;
A
Alek Du 已提交
96 97
}

98 99 100
static void __iomem *gpio_reg_2bit(struct gpio_chip *chip, unsigned offset,
				   enum GPIO_REG reg_type)
{
D
David Cohen 已提交
101
	struct lnw_gpio *lnw = to_lnw_priv(chip);
102 103 104
	unsigned nreg = chip->ngpio / 32;
	u8 reg = offset / 16;

105
	return lnw->reg_base + reg_type * nreg * 4 + reg * 4;
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
}

static int lnw_gpio_request(struct gpio_chip *chip, unsigned offset)
{
	void __iomem *gafr = gpio_reg_2bit(chip, offset, GAFR);
	u32 value = readl(gafr);
	int shift = (offset % 16) << 1, af = (value >> shift) & 3;

	if (af) {
		value &= ~(3 << shift);
		writel(value, gafr);
	}
	return 0;
}

A
Alek Du 已提交
121 122 123
static int lnw_gpio_get(struct gpio_chip *chip, unsigned offset)
{
	void __iomem *gplr = gpio_reg(chip, offset, GPLR);
124 125 126 127 128 129 130 131 132

	return readl(gplr) & BIT(offset % 32);
}

static void lnw_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
{
	void __iomem *gpsr, *gpcr;

	if (value) {
A
Alek Du 已提交
133
		gpsr = gpio_reg(chip, offset, GPSR);
134 135
		writel(BIT(offset % 32), gpsr);
	} else {
A
Alek Du 已提交
136
		gpcr = gpio_reg(chip, offset, GPCR);
137 138 139 140 141 142
		writel(BIT(offset % 32), gpcr);
	}
}

static int lnw_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
{
D
David Cohen 已提交
143
	struct lnw_gpio *lnw = to_lnw_priv(chip);
A
Alek Du 已提交
144
	void __iomem *gpdr = gpio_reg(chip, offset, GPDR);
145 146 147
	u32 value;
	unsigned long flags;

148 149 150
	if (lnw->pdev)
		pm_runtime_get(&lnw->pdev->dev);

151 152 153 154 155
	spin_lock_irqsave(&lnw->lock, flags);
	value = readl(gpdr);
	value &= ~BIT(offset % 32);
	writel(value, gpdr);
	spin_unlock_irqrestore(&lnw->lock, flags);
156 157 158 159

	if (lnw->pdev)
		pm_runtime_put(&lnw->pdev->dev);

160 161 162 163 164 165
	return 0;
}

static int lnw_gpio_direction_output(struct gpio_chip *chip,
			unsigned offset, int value)
{
D
David Cohen 已提交
166
	struct lnw_gpio *lnw = to_lnw_priv(chip);
A
Alek Du 已提交
167
	void __iomem *gpdr = gpio_reg(chip, offset, GPDR);
168 169 170
	unsigned long flags;

	lnw_gpio_set(chip, offset, value);
171 172 173 174

	if (lnw->pdev)
		pm_runtime_get(&lnw->pdev->dev);

175 176
	spin_lock_irqsave(&lnw->lock, flags);
	value = readl(gpdr);
177
	value |= BIT(offset % 32);
178 179
	writel(value, gpdr);
	spin_unlock_irqrestore(&lnw->lock, flags);
180 181 182 183

	if (lnw->pdev)
		pm_runtime_put(&lnw->pdev->dev);

184 185 186 187 188
	return 0;
}

static int lnw_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
{
D
David Cohen 已提交
189
	struct lnw_gpio *lnw = to_lnw_priv(chip);
190
	return irq_create_mapping(lnw->domain, offset);
191 192
}

193
static int lnw_irq_type(struct irq_data *d, unsigned type)
194
{
195
	struct lnw_gpio *lnw = irq_data_get_irq_chip_data(d);
196
	u32 gpio = irqd_to_hwirq(d);
197 198
	unsigned long flags;
	u32 value;
A
Alek Du 已提交
199 200
	void __iomem *grer = gpio_reg(&lnw->chip, gpio, GRER);
	void __iomem *gfer = gpio_reg(&lnw->chip, gpio, GFER);
201

202
	if (gpio >= lnw->chip.ngpio)
203
		return -EINVAL;
204 205 206 207

	if (lnw->pdev)
		pm_runtime_get(&lnw->pdev->dev);

208 209 210 211 212 213 214 215 216 217 218 219 220 221
	spin_lock_irqsave(&lnw->lock, flags);
	if (type & IRQ_TYPE_EDGE_RISING)
		value = readl(grer) | BIT(gpio % 32);
	else
		value = readl(grer) & (~BIT(gpio % 32));
	writel(value, grer);

	if (type & IRQ_TYPE_EDGE_FALLING)
		value = readl(gfer) | BIT(gpio % 32);
	else
		value = readl(gfer) & (~BIT(gpio % 32));
	writel(value, gfer);
	spin_unlock_irqrestore(&lnw->lock, flags);

222 223 224
	if (lnw->pdev)
		pm_runtime_put(&lnw->pdev->dev);

225
	return 0;
226
}
227

228
static void lnw_irq_unmask(struct irq_data *d)
229
{
230
}
231

232
static void lnw_irq_mask(struct irq_data *d)
233
{
234
}
235 236 237

static struct irq_chip lnw_irqchip = {
	.name		= "LNW-GPIO",
238 239 240
	.irq_mask	= lnw_irq_mask,
	.irq_unmask	= lnw_irq_unmask,
	.irq_set_type	= lnw_irq_type,
241 242
};

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
static const struct lnw_gpio_ddata gpio_lincroft = {
	.ngpio = 64,
};

static const struct lnw_gpio_ddata gpio_penwell_aon = {
	.ngpio = 96,
	.chip_irq_type = LNW_IRQ_TYPE_EDGE,
};

static const struct lnw_gpio_ddata gpio_penwell_core = {
	.ngpio = 96,
	.chip_irq_type = LNW_IRQ_TYPE_EDGE,
};

static const struct lnw_gpio_ddata gpio_cloverview_aon = {
	.ngpio = 96,
	.chip_irq_type = LNW_IRQ_TYPE_EDGE | LNW_IRQ_TYPE_LEVEL,
};

static const struct lnw_gpio_ddata gpio_cloverview_core = {
	.ngpio = 96,
	.chip_irq_type = LNW_IRQ_TYPE_EDGE,
};

static const struct lnw_gpio_ddata gpio_tangier = {
	.ngpio = 192,
	.gplr_offset = 4,
	.flis_base = 0xff0c0000,
	.flis_len = 0x8000,
	.get_flis_offset = NULL,
	.chip_irq_type = LNW_IRQ_TYPE_EDGE,
};

static DEFINE_PCI_DEVICE_TABLE(lnw_gpio_ids) = {
	{
		/* Lincroft */
		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x080f),
		.driver_data = (kernel_ulong_t)&gpio_lincroft,
	},
	{
		/* Penwell AON */
		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x081f),
		.driver_data = (kernel_ulong_t)&gpio_penwell_aon,
	},
	{
		/* Penwell Core */
		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x081a),
		.driver_data = (kernel_ulong_t)&gpio_penwell_core,
	},
	{
		/* Cloverview Aon */
		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x08eb),
		.driver_data = (kernel_ulong_t)&gpio_cloverview_aon,
	},
	{
		/* Cloverview Core */
		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x08f7),
		.driver_data = (kernel_ulong_t)&gpio_cloverview_core,
	},
	{
		/* Tangier */
		PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x1199),
		.driver_data = (kernel_ulong_t)&gpio_tangier,
	},
	{ 0 }
308 309 310 311 312
};
MODULE_DEVICE_TABLE(pci, lnw_gpio_ids);

static void lnw_irq_handler(unsigned irq, struct irq_desc *desc)
{
313 314 315
	struct irq_data *data = irq_desc_get_irq_data(desc);
	struct lnw_gpio *lnw = irq_data_get_irq_handler_data(data);
	struct irq_chip *chip = irq_data_get_irq_chip(data);
316
	u32 base, gpio, mask;
317
	unsigned long pending;
318 319 320
	void __iomem *gedr;

	/* check GPIO controller to check which pin triggered the interrupt */
A
Alek Du 已提交
321 322
	for (base = 0; base < lnw->chip.ngpio; base += 32) {
		gedr = gpio_reg(&lnw->chip, base, GEDR);
323
		while ((pending = readl(gedr))) {
324
			gpio = __ffs(pending);
325 326 327
			mask = BIT(gpio);
			/* Clear before handling so we can't lose an edge */
			writel(mask, gedr);
328 329
			generic_handle_irq(irq_find_mapping(lnw->domain,
							    base + gpio));
330
		}
331
	}
332

333
	chip->irq_eoi(data);
334 335
}

336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
static void lnw_irq_init_hw(struct lnw_gpio *lnw)
{
	void __iomem *reg;
	unsigned base;

	for (base = 0; base < lnw->chip.ngpio; base += 32) {
		/* Clear the rising-edge detect register */
		reg = gpio_reg(&lnw->chip, base, GRER);
		writel(0, reg);
		/* Clear the falling-edge detect register */
		reg = gpio_reg(&lnw->chip, base, GFER);
		writel(0, reg);
		/* Clear the edge detect status register */
		reg = gpio_reg(&lnw->chip, base, GEDR);
		writel(~0, reg);
	}
}

354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
static int lnw_gpio_irq_map(struct irq_domain *d, unsigned int virq,
			    irq_hw_number_t hw)
{
	struct lnw_gpio *lnw = d->host_data;

	irq_set_chip_and_handler_name(virq, &lnw_irqchip, handle_simple_irq,
				      "demux");
	irq_set_chip_data(virq, lnw);
	irq_set_irq_type(virq, IRQ_TYPE_NONE);

	return 0;
}

static const struct irq_domain_ops lnw_gpio_irq_ops = {
	.map = lnw_gpio_irq_map,
	.xlate = irq_domain_xlate_twocell,
};

372 373
static int lnw_gpio_runtime_idle(struct device *dev)
{
374
	pm_schedule_suspend(dev, 500);
375 376 377 378
	return -EBUSY;
}

static const struct dev_pm_ops lnw_gpio_pm_ops = {
D
David Cohen 已提交
379
	SET_RUNTIME_PM_OPS(NULL, NULL, lnw_gpio_runtime_idle)
380 381
};

B
Bill Pemberton 已提交
382
static int lnw_gpio_probe(struct pci_dev *pdev,
383
			  const struct pci_device_id *id)
384
{
385
	void __iomem *base;
386 387
	struct lnw_gpio *lnw;
	u32 gpio_base;
388
	u32 irq_base;
389
	int retval;
390
	struct lnw_gpio_ddata *ddata = (struct lnw_gpio_ddata *)id->driver_data;
391

392
	retval = pcim_enable_device(pdev);
393
	if (retval)
394
		return retval;
395

396
	retval = pcim_iomap_regions(pdev, 1 << 0 | 1 << 1, pci_name(pdev));
397
	if (retval) {
398 399
		dev_err(&pdev->dev, "I/O memory mapping error\n");
		return retval;
400
	}
401

402 403
	base = pcim_iomap_table(pdev)[1];

404 405 406
	irq_base = readl(base);
	gpio_base = readl(sizeof(u32) + base);

407
	/* release the IO mapping, since we already get the info from bar1 */
408
	pcim_iounmap_regions(pdev, 1 << 1);
409

D
David Cohen 已提交
410
	lnw = devm_kzalloc(&pdev->dev, sizeof(*lnw), GFP_KERNEL);
411
	if (!lnw) {
412
		dev_err(&pdev->dev, "can't allocate chip data\n");
413
		return -ENOMEM;
414
	}
415

416
	lnw->reg_base = pcim_iomap_table(pdev)[0];
417
	lnw->chip.label = dev_name(&pdev->dev);
418
	lnw->chip.request = lnw_gpio_request;
419 420 421 422 423 424
	lnw->chip.direction_input = lnw_gpio_direction_input;
	lnw->chip.direction_output = lnw_gpio_direction_output;
	lnw->chip.get = lnw_gpio_get;
	lnw->chip.set = lnw_gpio_set;
	lnw->chip.to_irq = lnw_gpio_to_irq;
	lnw->chip.base = gpio_base;
425
	lnw->chip.ngpio = ddata->ngpio;
426
	lnw->chip.can_sleep = 0;
427
	lnw->pdev = pdev;
428

429 430
	spin_lock_init(&lnw->lock);

431 432
	lnw->domain = irq_domain_add_simple(pdev->dev.of_node, ddata->ngpio,
					    irq_base, &lnw_gpio_irq_ops, lnw);
433 434
	if (!lnw->domain)
		return -ENOMEM;
435

436 437 438
	pci_set_drvdata(pdev, lnw);
	retval = gpiochip_add(&lnw->chip);
	if (retval) {
439
		dev_err(&pdev->dev, "gpiochip_add error %d\n", retval);
440
		return retval;
441
	}
442 443 444

	lnw_irq_init_hw(lnw);

445 446
	irq_set_handler_data(pdev->irq, lnw);
	irq_set_chained_handler(pdev->irq, lnw_irq_handler);
447

448 449 450
	pm_runtime_put_noidle(&pdev->dev);
	pm_runtime_allow(&pdev->dev);

451
	return 0;
452 453 454 455 456 457
}

static struct pci_driver lnw_gpio_driver = {
	.name		= "langwell_gpio",
	.id_table	= lnw_gpio_ids,
	.probe		= lnw_gpio_probe,
458 459 460
	.driver		= {
		.pm	= &lnw_gpio_pm_ops,
	},
461 462 463 464
};

static int __init lnw_gpio_init(void)
{
465
	return pci_register_driver(&lnw_gpio_driver);
466 467 468
}

device_initcall(lnw_gpio_init);