gpio-pch.c 13.6 KB
Newer Older
1
/*
2
 * Copyright (C) 2011 LAPIS Semiconductor Co., Ltd.
3 4 5 6 7 8 9 10 11 12 13 14 15 16
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 */
17
#include <linux/module.h>
18 19 20
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/gpio.h>
21 22
#include <linux/interrupt.h>
#include <linux/irq.h>
L
Linus Walleij 已提交
23
#include <linux/slab.h>
24 25 26 27 28 29 30 31 32

#define PCH_EDGE_FALLING	0
#define PCH_EDGE_RISING		BIT(0)
#define PCH_LEVEL_L		BIT(1)
#define PCH_LEVEL_H		(BIT(0) | BIT(1))
#define PCH_EDGE_BOTH		BIT(2)
#define PCH_IM_MASK		(BIT(0) | BIT(1) | BIT(2))

#define PCH_IRQ_BASE		24
33 34 35 36 37 38 39 40 41 42 43 44 45

struct pch_regs {
	u32	ien;
	u32	istatus;
	u32	idisp;
	u32	iclr;
	u32	imask;
	u32	imaskclr;
	u32	po;
	u32	pi;
	u32	pm;
	u32	im0;
	u32	im1;
46 47
	u32	reserved[3];
	u32	gpio_use_sel;
48 49 50
	u32	reset;
};

51 52
enum pch_type_t {
	INTEL_EG20T_PCH,
53 54
	OKISEMI_ML7223m_IOH, /* LAPIS Semiconductor ML7223 IOH PCIe Bus-m */
	OKISEMI_ML7223n_IOH  /* LAPIS Semiconductor ML7223 IOH PCIe Bus-n */
55 56 57 58 59 60 61 62 63
};

/* Specifies number of GPIO PINS */
static int gpio_pins[] = {
	[INTEL_EG20T_PCH] = 12,
	[OKISEMI_ML7223m_IOH] = 8,
	[OKISEMI_ML7223n_IOH] = 8,
};

64 65
/**
 * struct pch_gpio_reg_data - The register store data.
66 67
 * @ien_reg:	To store contents of IEN register.
 * @imask_reg:	To store contents of IMASK register.
68 69
 * @po_reg:	To store contents of PO register.
 * @pm_reg:	To store contents of PM register.
70 71 72 73
 * @im0_reg:	To store contents of IM0 register.
 * @im1_reg:	To store contents of IM1 register.
 * @gpio_use_sel_reg : To store contents of GPIO_USE_SEL register.
 *		       (Only ML7223 Bus-n)
74 75
 */
struct pch_gpio_reg_data {
76 77
	u32 ien_reg;
	u32 imask_reg;
78 79
	u32 po_reg;
	u32 pm_reg;
80 81 82
	u32 im0_reg;
	u32 im1_reg;
	u32 gpio_use_sel_reg;
83 84 85 86 87 88 89 90 91 92
};

/**
 * struct pch_gpio - GPIO private data structure.
 * @base:			PCI base address of Memory mapped I/O register.
 * @reg:			Memory mapped PCH GPIO register list.
 * @dev:			Pointer to device structure.
 * @gpio:			Data for GPIO infrastructure.
 * @pch_gpio_reg:		Memory mapped Register data is saved here
 *				when suspend.
93 94
 * @lock:			Used for register access protection
 * @irq_base:		Save base of IRQ number for interrupt
95
 * @ioh:		IOH ID
96
 * @spinlock:		Used for register access protection
97 98 99 100 101 102 103
 */
struct pch_gpio {
	void __iomem *base;
	struct pch_regs __iomem *reg;
	struct device *dev;
	struct gpio_chip gpio;
	struct pch_gpio_reg_data pch_gpio_reg;
104
	int irq_base;
105
	enum pch_type_t ioh;
106
	spinlock_t spinlock;
107 108 109 110 111
};

static void pch_gpio_set(struct gpio_chip *gpio, unsigned nr, int val)
{
	u32 reg_val;
112
	struct pch_gpio *chip =	gpiochip_get_data(gpio);
113
	unsigned long flags;
114

115
	spin_lock_irqsave(&chip->spinlock, flags);
116 117 118 119 120 121 122
	reg_val = ioread32(&chip->reg->po);
	if (val)
		reg_val |= (1 << nr);
	else
		reg_val &= ~(1 << nr);

	iowrite32(reg_val, &chip->reg->po);
123
	spin_unlock_irqrestore(&chip->spinlock, flags);
124 125 126 127
}

static int pch_gpio_get(struct gpio_chip *gpio, unsigned nr)
{
128
	struct pch_gpio *chip =	gpiochip_get_data(gpio);
129

130
	return (ioread32(&chip->reg->pi) >> nr) & 1;
131 132 133 134 135
}

static int pch_gpio_direction_output(struct gpio_chip *gpio, unsigned nr,
				     int val)
{
136
	struct pch_gpio *chip =	gpiochip_get_data(gpio);
137 138
	u32 pm;
	u32 reg_val;
139
	unsigned long flags;
140

141
	spin_lock_irqsave(&chip->spinlock, flags);
142 143 144 145 146 147

	reg_val = ioread32(&chip->reg->po);
	if (val)
		reg_val |= (1 << nr);
	else
		reg_val &= ~(1 << nr);
148
	iowrite32(reg_val, &chip->reg->po);
149 150 151 152 153

	pm = ioread32(&chip->reg->pm) & ((1 << gpio_pins[chip->ioh]) - 1);
	pm |= (1 << nr);
	iowrite32(pm, &chip->reg->pm);

154
	spin_unlock_irqrestore(&chip->spinlock, flags);
155 156 157 158 159 160

	return 0;
}

static int pch_gpio_direction_input(struct gpio_chip *gpio, unsigned nr)
{
161
	struct pch_gpio *chip =	gpiochip_get_data(gpio);
162
	u32 pm;
163
	unsigned long flags;
164

165
	spin_lock_irqsave(&chip->spinlock, flags);
166
	pm = ioread32(&chip->reg->pm) & ((1 << gpio_pins[chip->ioh]) - 1);
167 168
	pm &= ~(1 << nr);
	iowrite32(pm, &chip->reg->pm);
169
	spin_unlock_irqrestore(&chip->spinlock, flags);
170 171 172 173

	return 0;
}

174
#ifdef CONFIG_PM
175 176 177 178 179
/*
 * Save register configuration and disable interrupts.
 */
static void pch_gpio_save_reg_conf(struct pch_gpio *chip)
{
180 181
	chip->pch_gpio_reg.ien_reg = ioread32(&chip->reg->ien);
	chip->pch_gpio_reg.imask_reg = ioread32(&chip->reg->imask);
182 183
	chip->pch_gpio_reg.po_reg = ioread32(&chip->reg->po);
	chip->pch_gpio_reg.pm_reg = ioread32(&chip->reg->pm);
184 185 186 187 188 189
	chip->pch_gpio_reg.im0_reg = ioread32(&chip->reg->im0);
	if (chip->ioh == INTEL_EG20T_PCH)
		chip->pch_gpio_reg.im1_reg = ioread32(&chip->reg->im1);
	if (chip->ioh == OKISEMI_ML7223n_IOH)
		chip->pch_gpio_reg.gpio_use_sel_reg =\
					    ioread32(&chip->reg->gpio_use_sel);
190 191 192 193 194 195 196
}

/*
 * This function restores the register configuration of the GPIO device.
 */
static void pch_gpio_restore_reg_conf(struct pch_gpio *chip)
{
197 198
	iowrite32(chip->pch_gpio_reg.ien_reg, &chip->reg->ien);
	iowrite32(chip->pch_gpio_reg.imask_reg, &chip->reg->imask);
199 200 201 202
	/* to store contents of PO register */
	iowrite32(chip->pch_gpio_reg.po_reg, &chip->reg->po);
	/* to store contents of PM register */
	iowrite32(chip->pch_gpio_reg.pm_reg, &chip->reg->pm);
203 204 205 206 207 208
	iowrite32(chip->pch_gpio_reg.im0_reg, &chip->reg->im0);
	if (chip->ioh == INTEL_EG20T_PCH)
		iowrite32(chip->pch_gpio_reg.im1_reg, &chip->reg->im1);
	if (chip->ioh == OKISEMI_ML7223n_IOH)
		iowrite32(chip->pch_gpio_reg.gpio_use_sel_reg,
			  &chip->reg->gpio_use_sel);
209
}
210
#endif
211

212 213
static int pch_gpio_to_irq(struct gpio_chip *gpio, unsigned offset)
{
214
	struct pch_gpio *chip = gpiochip_get_data(gpio);
215 216 217
	return chip->irq_base + offset;
}

218 219 220 221 222
static void pch_gpio_setup(struct pch_gpio *chip)
{
	struct gpio_chip *gpio = &chip->gpio;

	gpio->label = dev_name(chip->dev);
223
	gpio->parent = chip->dev;
224 225 226 227 228 229 230
	gpio->owner = THIS_MODULE;
	gpio->direction_input = pch_gpio_direction_input;
	gpio->get = pch_gpio_get;
	gpio->direction_output = pch_gpio_direction_output;
	gpio->set = pch_gpio_set;
	gpio->dbg_show = NULL;
	gpio->base = -1;
231
	gpio->ngpio = gpio_pins[chip->ioh];
232
	gpio->can_sleep = false;
233 234 235 236 237 238 239
	gpio->to_irq = pch_gpio_to_irq;
}

static int pch_irq_type(struct irq_data *d, unsigned int type)
{
	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
	struct pch_gpio *chip = gc->private;
240 241 242 243
	u32 im, im_pos, val;
	u32 __iomem *im_reg;
	unsigned long flags;
	int ch, irq = d->irq;
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

	ch = irq - chip->irq_base;
	if (irq <= chip->irq_base + 7) {
		im_reg = &chip->reg->im0;
		im_pos = ch;
	} else {
		im_reg = &chip->reg->im1;
		im_pos = ch - 8;
	}
	dev_dbg(chip->dev, "%s:irq=%d type=%d ch=%d pos=%d\n",
		__func__, irq, type, ch, im_pos);

	spin_lock_irqsave(&chip->spinlock, flags);

	switch (type) {
	case IRQ_TYPE_EDGE_RISING:
		val = PCH_EDGE_RISING;
		break;
	case IRQ_TYPE_EDGE_FALLING:
		val = PCH_EDGE_FALLING;
		break;
	case IRQ_TYPE_EDGE_BOTH:
		val = PCH_EDGE_BOTH;
		break;
	case IRQ_TYPE_LEVEL_HIGH:
		val = PCH_LEVEL_H;
		break;
	case IRQ_TYPE_LEVEL_LOW:
		val = PCH_LEVEL_L;
		break;
	default:
275
		goto unlock;
276 277 278 279 280 281
	}

	/* Set interrupt mode */
	im = ioread32(im_reg) & ~(PCH_IM_MASK << (im_pos * 4));
	iowrite32(im | (val << (im_pos * 4)), im_reg);

282 283
	/* And the handler */
	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
284
		irq_set_handler_locked(d, handle_level_irq);
285
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
286
		irq_set_handler_locked(d, handle_edge_irq);
287

288
unlock:
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
	spin_unlock_irqrestore(&chip->spinlock, flags);
	return 0;
}

static void pch_irq_unmask(struct irq_data *d)
{
	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
	struct pch_gpio *chip = gc->private;

	iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->imaskclr);
}

static void pch_irq_mask(struct irq_data *d)
{
	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
	struct pch_gpio *chip = gc->private;

	iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->imask);
}

309 310 311 312 313 314 315 316
static void pch_irq_ack(struct irq_data *d)
{
	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
	struct pch_gpio *chip = gc->private;

	iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->iclr);
}

317 318 319 320
static irqreturn_t pch_gpio_handler(int irq, void *dev_id)
{
	struct pch_gpio *chip = dev_id;
	u32 reg_val = ioread32(&chip->reg->istatus);
321
	int i, ret = IRQ_NONE;
322 323 324 325 326 327 328 329 330 331 332 333

	for (i = 0; i < gpio_pins[chip->ioh]; i++) {
		if (reg_val & BIT(i)) {
			dev_dbg(chip->dev, "%s:[%d]:irq=%d  status=0x%x\n",
				__func__, i, irq, reg_val);
			generic_handle_irq(chip->irq_base + i);
			ret = IRQ_HANDLED;
		}
	}
	return ret;
}

334 335 336
static int pch_gpio_alloc_generic_chip(struct pch_gpio *chip,
				       unsigned int irq_start,
				       unsigned int num)
337 338 339 340 341 342
{
	struct irq_chip_generic *gc;
	struct irq_chip_type *ct;

	gc = irq_alloc_generic_chip("pch_gpio", 1, irq_start, chip->base,
				    handle_simple_irq);
343 344 345
	if (!gc)
		return -ENOMEM;

346 347 348
	gc->private = chip;
	ct = gc->chip_types;

349
	ct->chip.irq_ack = pch_irq_ack;
350 351 352 353 354 355
	ct->chip.irq_mask = pch_irq_mask;
	ct->chip.irq_unmask = pch_irq_unmask;
	ct->chip.irq_set_type = pch_irq_type;

	irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
			       IRQ_NOREQUEST | IRQ_NOPROBE, 0);
356 357

	return 0;
358 359
}

B
Bill Pemberton 已提交
360
static int pch_gpio_probe(struct pci_dev *pdev,
361 362 363 364
				    const struct pci_device_id *id)
{
	s32 ret;
	struct pch_gpio *chip;
365
	int irq_base;
366
	u32 msk;
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385

	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
	if (chip == NULL)
		return -ENOMEM;

	chip->dev = &pdev->dev;
	ret = pci_enable_device(pdev);
	if (ret) {
		dev_err(&pdev->dev, "%s : pci_enable_device FAILED", __func__);
		goto err_pci_enable;
	}

	ret = pci_request_regions(pdev, KBUILD_MODNAME);
	if (ret) {
		dev_err(&pdev->dev, "pci_request_regions FAILED-%d", ret);
		goto err_request_regions;
	}

	chip->base = pci_iomap(pdev, 1, 0);
386
	if (!chip->base) {
387 388 389 390 391
		dev_err(&pdev->dev, "%s : pci_iomap FAILED", __func__);
		ret = -ENOMEM;
		goto err_iomap;
	}

392 393 394 395 396 397 398
	if (pdev->device == 0x8803)
		chip->ioh = INTEL_EG20T_PCH;
	else if (pdev->device == 0x8014)
		chip->ioh = OKISEMI_ML7223m_IOH;
	else if (pdev->device == 0x8043)
		chip->ioh = OKISEMI_ML7223n_IOH;

399 400
	chip->reg = chip->base;
	pci_set_drvdata(pdev, chip);
401
	spin_lock_init(&chip->spinlock);
402
	pch_gpio_setup(chip);
L
Linus Walleij 已提交
403
#ifdef CONFIG_OF_GPIO
404
	chip->gpio.of_node = pdev->dev.of_node;
L
Linus Walleij 已提交
405
#endif
406
	ret = gpiochip_add_data(&chip->gpio, chip);
407 408 409 410 411
	if (ret) {
		dev_err(&pdev->dev, "PCH gpio: Failed to register GPIO\n");
		goto err_gpiochip_add;
	}

412 413
	irq_base = devm_irq_alloc_descs(&pdev->dev, -1, 0,
					gpio_pins[chip->ioh], NUMA_NO_NODE);
414 415 416 417 418 419 420
	if (irq_base < 0) {
		dev_warn(&pdev->dev, "PCH gpio: Failed to get IRQ base num\n");
		chip->irq_base = -1;
		goto end;
	}
	chip->irq_base = irq_base;

421 422 423 424 425
	/* Mask all interrupts, but enable them */
	msk = (1 << gpio_pins[chip->ioh]) - 1;
	iowrite32(msk, &chip->reg->imask);
	iowrite32(msk, &chip->reg->ien);

426 427
	ret = devm_request_irq(&pdev->dev, pdev->irq, pch_gpio_handler,
			       IRQF_SHARED, KBUILD_MODNAME, chip);
428 429 430 431 432 433
	if (ret != 0) {
		dev_err(&pdev->dev,
			"%s request_irq failed\n", __func__);
		goto err_request_irq;
	}

434 435 436 437
	ret = pch_gpio_alloc_generic_chip(chip, irq_base,
					  gpio_pins[chip->ioh]);
	if (ret)
		goto err_request_irq;
438 439

end:
440 441
	return 0;

442
err_request_irq:
443
	gpiochip_remove(&chip->gpio);
444

445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
err_gpiochip_add:
	pci_iounmap(pdev, chip->base);

err_iomap:
	pci_release_regions(pdev);

err_request_regions:
	pci_disable_device(pdev);

err_pci_enable:
	kfree(chip);
	dev_err(&pdev->dev, "%s Failed returns %d\n", __func__, ret);
	return ret;
}

B
Bill Pemberton 已提交
460
static void pch_gpio_remove(struct pci_dev *pdev)
461 462 463
{
	struct pch_gpio *chip = pci_get_drvdata(pdev);

464
	gpiochip_remove(&chip->gpio);
465 466 467 468 469 470 471 472 473 474 475
	pci_iounmap(pdev, chip->base);
	pci_release_regions(pdev);
	pci_disable_device(pdev);
	kfree(chip);
}

#ifdef CONFIG_PM
static int pch_gpio_suspend(struct pci_dev *pdev, pm_message_t state)
{
	s32 ret;
	struct pch_gpio *chip = pci_get_drvdata(pdev);
476
	unsigned long flags;
477

478
	spin_lock_irqsave(&chip->spinlock, flags);
479
	pch_gpio_save_reg_conf(chip);
480
	spin_unlock_irqrestore(&chip->spinlock, flags);
481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499

	ret = pci_save_state(pdev);
	if (ret) {
		dev_err(&pdev->dev, "pci_save_state Failed-%d\n", ret);
		return ret;
	}
	pci_disable_device(pdev);
	pci_set_power_state(pdev, PCI_D0);
	ret = pci_enable_wake(pdev, PCI_D0, 1);
	if (ret)
		dev_err(&pdev->dev, "pci_enable_wake Failed -%d\n", ret);

	return 0;
}

static int pch_gpio_resume(struct pci_dev *pdev)
{
	s32 ret;
	struct pch_gpio *chip = pci_get_drvdata(pdev);
500
	unsigned long flags;
501 502 503 504 505 506 507 508 509 510 511

	ret = pci_enable_wake(pdev, PCI_D0, 0);

	pci_set_power_state(pdev, PCI_D0);
	ret = pci_enable_device(pdev);
	if (ret) {
		dev_err(&pdev->dev, "pci_enable_device Failed-%d ", ret);
		return ret;
	}
	pci_restore_state(pdev);

512
	spin_lock_irqsave(&chip->spinlock, flags);
513 514 515
	iowrite32(0x01, &chip->reg->reset);
	iowrite32(0x00, &chip->reg->reset);
	pch_gpio_restore_reg_conf(chip);
516
	spin_unlock_irqrestore(&chip->spinlock, flags);
517 518 519 520 521 522 523 524

	return 0;
}
#else
#define pch_gpio_suspend NULL
#define pch_gpio_resume NULL
#endif

525
#define PCI_VENDOR_ID_ROHM             0x10DB
526
static const struct pci_device_id pch_gpio_pcidev_id[] = {
527
	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8803) },
528
	{ PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8014) },
529
	{ PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8043) },
530
	{ PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8803) },
531 532
	{ 0, }
};
A
Axel Lin 已提交
533
MODULE_DEVICE_TABLE(pci, pch_gpio_pcidev_id);
534 535 536 537 538

static struct pci_driver pch_gpio_driver = {
	.name = "pch_gpio",
	.id_table = pch_gpio_pcidev_id,
	.probe = pch_gpio_probe,
B
Bill Pemberton 已提交
539
	.remove = pch_gpio_remove,
540 541 542 543
	.suspend = pch_gpio_suspend,
	.resume = pch_gpio_resume
};

544
module_pci_driver(pch_gpio_driver);
545 546 547

MODULE_DESCRIPTION("PCH GPIO PCI Driver");
MODULE_LICENSE("GPL");