2
0

pxa2xx_gpio.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. /*
  2. * Intel XScale PXA255/270 GPIO controller emulation.
  3. *
  4. * Copyright (c) 2006 Openedhand Ltd.
  5. * Written by Andrzej Zaborowski <balrog@zabor.org>
  6. *
  7. * This code is licensed under the GPL.
  8. */
  9. #include "qemu/osdep.h"
  10. #include "cpu.h"
  11. #include "hw/hw.h"
  12. #include "hw/irq.h"
  13. #include "hw/qdev-properties.h"
  14. #include "hw/sysbus.h"
  15. #include "migration/vmstate.h"
  16. #include "hw/arm/pxa.h"
  17. #include "qemu/log.h"
  18. #include "qemu/module.h"
  19. #define PXA2XX_GPIO_BANKS 4
  20. #define TYPE_PXA2XX_GPIO "pxa2xx-gpio"
  21. #define PXA2XX_GPIO(obj) \
  22. OBJECT_CHECK(PXA2xxGPIOInfo, (obj), TYPE_PXA2XX_GPIO)
  23. typedef struct PXA2xxGPIOInfo PXA2xxGPIOInfo;
  24. struct PXA2xxGPIOInfo {
  25. /*< private >*/
  26. SysBusDevice parent_obj;
  27. /*< public >*/
  28. MemoryRegion iomem;
  29. qemu_irq irq0, irq1, irqX;
  30. int lines;
  31. int ncpu;
  32. ARMCPU *cpu;
  33. /* XXX: GNU C vectors are more suitable */
  34. uint32_t ilevel[PXA2XX_GPIO_BANKS];
  35. uint32_t olevel[PXA2XX_GPIO_BANKS];
  36. uint32_t dir[PXA2XX_GPIO_BANKS];
  37. uint32_t rising[PXA2XX_GPIO_BANKS];
  38. uint32_t falling[PXA2XX_GPIO_BANKS];
  39. uint32_t status[PXA2XX_GPIO_BANKS];
  40. uint32_t gafr[PXA2XX_GPIO_BANKS * 2];
  41. uint32_t prev_level[PXA2XX_GPIO_BANKS];
  42. qemu_irq handler[PXA2XX_GPIO_BANKS * 32];
  43. qemu_irq read_notify;
  44. };
  45. static struct {
  46. enum {
  47. GPIO_NONE,
  48. GPLR,
  49. GPSR,
  50. GPCR,
  51. GPDR,
  52. GRER,
  53. GFER,
  54. GEDR,
  55. GAFR_L,
  56. GAFR_U,
  57. } reg;
  58. int bank;
  59. } pxa2xx_gpio_regs[0x200] = {
  60. [0 ... 0x1ff] = { GPIO_NONE, 0 },
  61. #define PXA2XX_REG(reg, a0, a1, a2, a3) \
  62. [a0] = { reg, 0 }, [a1] = { reg, 1 }, [a2] = { reg, 2 }, [a3] = { reg, 3 },
  63. PXA2XX_REG(GPLR, 0x000, 0x004, 0x008, 0x100)
  64. PXA2XX_REG(GPSR, 0x018, 0x01c, 0x020, 0x118)
  65. PXA2XX_REG(GPCR, 0x024, 0x028, 0x02c, 0x124)
  66. PXA2XX_REG(GPDR, 0x00c, 0x010, 0x014, 0x10c)
  67. PXA2XX_REG(GRER, 0x030, 0x034, 0x038, 0x130)
  68. PXA2XX_REG(GFER, 0x03c, 0x040, 0x044, 0x13c)
  69. PXA2XX_REG(GEDR, 0x048, 0x04c, 0x050, 0x148)
  70. PXA2XX_REG(GAFR_L, 0x054, 0x05c, 0x064, 0x06c)
  71. PXA2XX_REG(GAFR_U, 0x058, 0x060, 0x068, 0x070)
  72. };
  73. static void pxa2xx_gpio_irq_update(PXA2xxGPIOInfo *s)
  74. {
  75. if (s->status[0] & (1 << 0))
  76. qemu_irq_raise(s->irq0);
  77. else
  78. qemu_irq_lower(s->irq0);
  79. if (s->status[0] & (1 << 1))
  80. qemu_irq_raise(s->irq1);
  81. else
  82. qemu_irq_lower(s->irq1);
  83. if ((s->status[0] & ~3) | s->status[1] | s->status[2] | s->status[3])
  84. qemu_irq_raise(s->irqX);
  85. else
  86. qemu_irq_lower(s->irqX);
  87. }
  88. /* Bitmap of pins used as standby and sleep wake-up sources. */
  89. static const int pxa2xx_gpio_wake[PXA2XX_GPIO_BANKS] = {
  90. 0x8003fe1b, 0x002001fc, 0xec080000, 0x0012007f,
  91. };
  92. static void pxa2xx_gpio_set(void *opaque, int line, int level)
  93. {
  94. PXA2xxGPIOInfo *s = (PXA2xxGPIOInfo *) opaque;
  95. CPUState *cpu = CPU(s->cpu);
  96. int bank;
  97. uint32_t mask;
  98. if (line >= s->lines) {
  99. printf("%s: No GPIO pin %i\n", __func__, line);
  100. return;
  101. }
  102. bank = line >> 5;
  103. mask = 1U << (line & 31);
  104. if (level) {
  105. s->status[bank] |= s->rising[bank] & mask &
  106. ~s->ilevel[bank] & ~s->dir[bank];
  107. s->ilevel[bank] |= mask;
  108. } else {
  109. s->status[bank] |= s->falling[bank] & mask &
  110. s->ilevel[bank] & ~s->dir[bank];
  111. s->ilevel[bank] &= ~mask;
  112. }
  113. if (s->status[bank] & mask)
  114. pxa2xx_gpio_irq_update(s);
  115. /* Wake-up GPIOs */
  116. if (cpu->halted && (mask & ~s->dir[bank] & pxa2xx_gpio_wake[bank])) {
  117. cpu_interrupt(cpu, CPU_INTERRUPT_EXITTB);
  118. }
  119. }
  120. static void pxa2xx_gpio_handler_update(PXA2xxGPIOInfo *s) {
  121. uint32_t level, diff;
  122. int i, bit, line;
  123. for (i = 0; i < PXA2XX_GPIO_BANKS; i ++) {
  124. level = s->olevel[i] & s->dir[i];
  125. for (diff = s->prev_level[i] ^ level; diff; diff ^= 1 << bit) {
  126. bit = ctz32(diff);
  127. line = bit + 32 * i;
  128. qemu_set_irq(s->handler[line], (level >> bit) & 1);
  129. }
  130. s->prev_level[i] = level;
  131. }
  132. }
  133. static uint64_t pxa2xx_gpio_read(void *opaque, hwaddr offset,
  134. unsigned size)
  135. {
  136. PXA2xxGPIOInfo *s = (PXA2xxGPIOInfo *) opaque;
  137. uint32_t ret;
  138. int bank;
  139. if (offset >= 0x200)
  140. return 0;
  141. bank = pxa2xx_gpio_regs[offset].bank;
  142. switch (pxa2xx_gpio_regs[offset].reg) {
  143. case GPDR: /* GPIO Pin-Direction registers */
  144. return s->dir[bank];
  145. case GPSR: /* GPIO Pin-Output Set registers */
  146. qemu_log_mask(LOG_GUEST_ERROR,
  147. "pxa2xx GPIO: read from write only register GPSR\n");
  148. return 0;
  149. case GPCR: /* GPIO Pin-Output Clear registers */
  150. qemu_log_mask(LOG_GUEST_ERROR,
  151. "pxa2xx GPIO: read from write only register GPCR\n");
  152. return 0;
  153. case GRER: /* GPIO Rising-Edge Detect Enable registers */
  154. return s->rising[bank];
  155. case GFER: /* GPIO Falling-Edge Detect Enable registers */
  156. return s->falling[bank];
  157. case GAFR_L: /* GPIO Alternate Function registers */
  158. return s->gafr[bank * 2];
  159. case GAFR_U: /* GPIO Alternate Function registers */
  160. return s->gafr[bank * 2 + 1];
  161. case GPLR: /* GPIO Pin-Level registers */
  162. ret = (s->olevel[bank] & s->dir[bank]) |
  163. (s->ilevel[bank] & ~s->dir[bank]);
  164. qemu_irq_raise(s->read_notify);
  165. return ret;
  166. case GEDR: /* GPIO Edge Detect Status registers */
  167. return s->status[bank];
  168. default:
  169. hw_error("%s: Bad offset " REG_FMT "\n", __func__, offset);
  170. }
  171. return 0;
  172. }
  173. static void pxa2xx_gpio_write(void *opaque, hwaddr offset,
  174. uint64_t value, unsigned size)
  175. {
  176. PXA2xxGPIOInfo *s = (PXA2xxGPIOInfo *) opaque;
  177. int bank;
  178. if (offset >= 0x200)
  179. return;
  180. bank = pxa2xx_gpio_regs[offset].bank;
  181. switch (pxa2xx_gpio_regs[offset].reg) {
  182. case GPDR: /* GPIO Pin-Direction registers */
  183. s->dir[bank] = value;
  184. pxa2xx_gpio_handler_update(s);
  185. break;
  186. case GPSR: /* GPIO Pin-Output Set registers */
  187. s->olevel[bank] |= value;
  188. pxa2xx_gpio_handler_update(s);
  189. break;
  190. case GPCR: /* GPIO Pin-Output Clear registers */
  191. s->olevel[bank] &= ~value;
  192. pxa2xx_gpio_handler_update(s);
  193. break;
  194. case GRER: /* GPIO Rising-Edge Detect Enable registers */
  195. s->rising[bank] = value;
  196. break;
  197. case GFER: /* GPIO Falling-Edge Detect Enable registers */
  198. s->falling[bank] = value;
  199. break;
  200. case GAFR_L: /* GPIO Alternate Function registers */
  201. s->gafr[bank * 2] = value;
  202. break;
  203. case GAFR_U: /* GPIO Alternate Function registers */
  204. s->gafr[bank * 2 + 1] = value;
  205. break;
  206. case GEDR: /* GPIO Edge Detect Status registers */
  207. s->status[bank] &= ~value;
  208. pxa2xx_gpio_irq_update(s);
  209. break;
  210. default:
  211. hw_error("%s: Bad offset " REG_FMT "\n", __func__, offset);
  212. }
  213. }
  214. static const MemoryRegionOps pxa_gpio_ops = {
  215. .read = pxa2xx_gpio_read,
  216. .write = pxa2xx_gpio_write,
  217. .endianness = DEVICE_NATIVE_ENDIAN,
  218. };
  219. DeviceState *pxa2xx_gpio_init(hwaddr base,
  220. ARMCPU *cpu, DeviceState *pic, int lines)
  221. {
  222. CPUState *cs = CPU(cpu);
  223. DeviceState *dev;
  224. dev = qdev_create(NULL, TYPE_PXA2XX_GPIO);
  225. qdev_prop_set_int32(dev, "lines", lines);
  226. qdev_prop_set_int32(dev, "ncpu", cs->cpu_index);
  227. qdev_init_nofail(dev);
  228. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
  229. sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
  230. qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_0));
  231. sysbus_connect_irq(SYS_BUS_DEVICE(dev), 1,
  232. qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_1));
  233. sysbus_connect_irq(SYS_BUS_DEVICE(dev), 2,
  234. qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_X));
  235. return dev;
  236. }
  237. static void pxa2xx_gpio_initfn(Object *obj)
  238. {
  239. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  240. DeviceState *dev = DEVICE(sbd);
  241. PXA2xxGPIOInfo *s = PXA2XX_GPIO(dev);
  242. memory_region_init_io(&s->iomem, obj, &pxa_gpio_ops,
  243. s, "pxa2xx-gpio", 0x1000);
  244. sysbus_init_mmio(sbd, &s->iomem);
  245. sysbus_init_irq(sbd, &s->irq0);
  246. sysbus_init_irq(sbd, &s->irq1);
  247. sysbus_init_irq(sbd, &s->irqX);
  248. }
  249. static void pxa2xx_gpio_realize(DeviceState *dev, Error **errp)
  250. {
  251. PXA2xxGPIOInfo *s = PXA2XX_GPIO(dev);
  252. s->cpu = ARM_CPU(qemu_get_cpu(s->ncpu));
  253. qdev_init_gpio_in(dev, pxa2xx_gpio_set, s->lines);
  254. qdev_init_gpio_out(dev, s->handler, s->lines);
  255. }
  256. /*
  257. * Registers a callback to notify on GPLR reads. This normally
  258. * shouldn't be needed but it is used for the hack on Spitz machines.
  259. */
  260. void pxa2xx_gpio_read_notifier(DeviceState *dev, qemu_irq handler)
  261. {
  262. PXA2xxGPIOInfo *s = PXA2XX_GPIO(dev);
  263. s->read_notify = handler;
  264. }
  265. static const VMStateDescription vmstate_pxa2xx_gpio_regs = {
  266. .name = "pxa2xx-gpio",
  267. .version_id = 1,
  268. .minimum_version_id = 1,
  269. .fields = (VMStateField[]) {
  270. VMSTATE_UINT32_ARRAY(ilevel, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
  271. VMSTATE_UINT32_ARRAY(olevel, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
  272. VMSTATE_UINT32_ARRAY(dir, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
  273. VMSTATE_UINT32_ARRAY(rising, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
  274. VMSTATE_UINT32_ARRAY(falling, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
  275. VMSTATE_UINT32_ARRAY(status, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
  276. VMSTATE_UINT32_ARRAY(gafr, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS * 2),
  277. VMSTATE_UINT32_ARRAY(prev_level, PXA2xxGPIOInfo, PXA2XX_GPIO_BANKS),
  278. VMSTATE_END_OF_LIST(),
  279. },
  280. };
  281. static Property pxa2xx_gpio_properties[] = {
  282. DEFINE_PROP_INT32("lines", PXA2xxGPIOInfo, lines, 0),
  283. DEFINE_PROP_INT32("ncpu", PXA2xxGPIOInfo, ncpu, 0),
  284. DEFINE_PROP_END_OF_LIST(),
  285. };
  286. static void pxa2xx_gpio_class_init(ObjectClass *klass, void *data)
  287. {
  288. DeviceClass *dc = DEVICE_CLASS(klass);
  289. dc->desc = "PXA2xx GPIO controller";
  290. dc->props = pxa2xx_gpio_properties;
  291. dc->vmsd = &vmstate_pxa2xx_gpio_regs;
  292. dc->realize = pxa2xx_gpio_realize;
  293. }
  294. static const TypeInfo pxa2xx_gpio_info = {
  295. .name = TYPE_PXA2XX_GPIO,
  296. .parent = TYPE_SYS_BUS_DEVICE,
  297. .instance_size = sizeof(PXA2xxGPIOInfo),
  298. .instance_init = pxa2xx_gpio_initfn,
  299. .class_init = pxa2xx_gpio_class_init,
  300. };
  301. static void pxa2xx_gpio_register_types(void)
  302. {
  303. type_register_static(&pxa2xx_gpio_info);
  304. }
  305. type_init(pxa2xx_gpio_register_types)