0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include "priv.h"
0025
0026 void
0027 g94_gpio_intr_stat(struct nvkm_gpio *gpio, u32 *hi, u32 *lo)
0028 {
0029 struct nvkm_device *device = gpio->subdev.device;
0030 u32 intr0 = nvkm_rd32(device, 0x00e054);
0031 u32 intr1 = nvkm_rd32(device, 0x00e074);
0032 u32 stat0 = nvkm_rd32(device, 0x00e050) & intr0;
0033 u32 stat1 = nvkm_rd32(device, 0x00e070) & intr1;
0034 *lo = (stat1 & 0xffff0000) | (stat0 >> 16);
0035 *hi = (stat1 << 16) | (stat0 & 0x0000ffff);
0036 nvkm_wr32(device, 0x00e054, intr0);
0037 nvkm_wr32(device, 0x00e074, intr1);
0038 }
0039
0040 void
0041 g94_gpio_intr_mask(struct nvkm_gpio *gpio, u32 type, u32 mask, u32 data)
0042 {
0043 struct nvkm_device *device = gpio->subdev.device;
0044 u32 inte0 = nvkm_rd32(device, 0x00e050);
0045 u32 inte1 = nvkm_rd32(device, 0x00e070);
0046 if (type & NVKM_GPIO_LO)
0047 inte0 = (inte0 & ~(mask << 16)) | (data << 16);
0048 if (type & NVKM_GPIO_HI)
0049 inte0 = (inte0 & ~(mask & 0xffff)) | (data & 0xffff);
0050 mask >>= 16;
0051 data >>= 16;
0052 if (type & NVKM_GPIO_LO)
0053 inte1 = (inte1 & ~(mask << 16)) | (data << 16);
0054 if (type & NVKM_GPIO_HI)
0055 inte1 = (inte1 & ~mask) | data;
0056 nvkm_wr32(device, 0x00e050, inte0);
0057 nvkm_wr32(device, 0x00e070, inte1);
0058 }
0059
0060 static const struct nvkm_gpio_func
0061 g94_gpio = {
0062 .lines = 32,
0063 .intr_stat = g94_gpio_intr_stat,
0064 .intr_mask = g94_gpio_intr_mask,
0065 .drive = nv50_gpio_drive,
0066 .sense = nv50_gpio_sense,
0067 .reset = nv50_gpio_reset,
0068 };
0069
0070 int
0071 g94_gpio_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
0072 struct nvkm_gpio **pgpio)
0073 {
0074 return nvkm_gpio_new_(&g94_gpio, device, type, inst, pgpio);
0075 }