qe_io.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * arch/powerpc/sysdev/qe_lib/qe_io.c
  4. *
  5. * QE Parallel I/O ports configuration routines
  6. *
  7. * Copyright 2006 Freescale Semiconductor, Inc. All rights reserved.
  8. *
  9. * Author: Li Yang <[email protected]>
  10. * Based on code from Shlomi Gridish <[email protected]>
  11. */
  12. #include <linux/stddef.h>
  13. #include <linux/kernel.h>
  14. #include <linux/errno.h>
  15. #include <linux/module.h>
  16. #include <linux/ioport.h>
  17. #include <asm/io.h>
  18. #include <soc/fsl/qe/qe.h>
  19. #undef DEBUG
  20. static struct qe_pio_regs __iomem *par_io;
  21. static int num_par_io_ports = 0;
  22. int par_io_init(struct device_node *np)
  23. {
  24. struct resource res;
  25. int ret;
  26. u32 num_ports;
  27. /* Map Parallel I/O ports registers */
  28. ret = of_address_to_resource(np, 0, &res);
  29. if (ret)
  30. return ret;
  31. par_io = ioremap(res.start, resource_size(&res));
  32. if (!par_io)
  33. return -ENOMEM;
  34. if (!of_property_read_u32(np, "num-ports", &num_ports))
  35. num_par_io_ports = num_ports;
  36. return 0;
  37. }
  38. void __par_io_config_pin(struct qe_pio_regs __iomem *par_io, u8 pin, int dir,
  39. int open_drain, int assignment, int has_irq)
  40. {
  41. u32 pin_mask1bit;
  42. u32 pin_mask2bits;
  43. u32 new_mask2bits;
  44. u32 tmp_val;
  45. /* calculate pin location for single and 2 bits information */
  46. pin_mask1bit = (u32) (1 << (QE_PIO_PINS - (pin + 1)));
  47. /* Set open drain, if required */
  48. tmp_val = ioread32be(&par_io->cpodr);
  49. if (open_drain)
  50. iowrite32be(pin_mask1bit | tmp_val, &par_io->cpodr);
  51. else
  52. iowrite32be(~pin_mask1bit & tmp_val, &par_io->cpodr);
  53. /* define direction */
  54. tmp_val = (pin > (QE_PIO_PINS / 2) - 1) ?
  55. ioread32be(&par_io->cpdir2) :
  56. ioread32be(&par_io->cpdir1);
  57. /* get all bits mask for 2 bit per port */
  58. pin_mask2bits = (u32) (0x3 << (QE_PIO_PINS -
  59. (pin % (QE_PIO_PINS / 2) + 1) * 2));
  60. /* Get the final mask we need for the right definition */
  61. new_mask2bits = (u32) (dir << (QE_PIO_PINS -
  62. (pin % (QE_PIO_PINS / 2) + 1) * 2));
  63. /* clear and set 2 bits mask */
  64. if (pin > (QE_PIO_PINS / 2) - 1) {
  65. iowrite32be(~pin_mask2bits & tmp_val, &par_io->cpdir2);
  66. tmp_val &= ~pin_mask2bits;
  67. iowrite32be(new_mask2bits | tmp_val, &par_io->cpdir2);
  68. } else {
  69. iowrite32be(~pin_mask2bits & tmp_val, &par_io->cpdir1);
  70. tmp_val &= ~pin_mask2bits;
  71. iowrite32be(new_mask2bits | tmp_val, &par_io->cpdir1);
  72. }
  73. /* define pin assignment */
  74. tmp_val = (pin > (QE_PIO_PINS / 2) - 1) ?
  75. ioread32be(&par_io->cppar2) :
  76. ioread32be(&par_io->cppar1);
  77. new_mask2bits = (u32) (assignment << (QE_PIO_PINS -
  78. (pin % (QE_PIO_PINS / 2) + 1) * 2));
  79. /* clear and set 2 bits mask */
  80. if (pin > (QE_PIO_PINS / 2) - 1) {
  81. iowrite32be(~pin_mask2bits & tmp_val, &par_io->cppar2);
  82. tmp_val &= ~pin_mask2bits;
  83. iowrite32be(new_mask2bits | tmp_val, &par_io->cppar2);
  84. } else {
  85. iowrite32be(~pin_mask2bits & tmp_val, &par_io->cppar1);
  86. tmp_val &= ~pin_mask2bits;
  87. iowrite32be(new_mask2bits | tmp_val, &par_io->cppar1);
  88. }
  89. }
  90. EXPORT_SYMBOL(__par_io_config_pin);
  91. int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain,
  92. int assignment, int has_irq)
  93. {
  94. if (!par_io || port >= num_par_io_ports)
  95. return -EINVAL;
  96. __par_io_config_pin(&par_io[port], pin, dir, open_drain, assignment,
  97. has_irq);
  98. return 0;
  99. }
  100. EXPORT_SYMBOL(par_io_config_pin);
  101. int par_io_data_set(u8 port, u8 pin, u8 val)
  102. {
  103. u32 pin_mask, tmp_val;
  104. if (port >= num_par_io_ports)
  105. return -EINVAL;
  106. if (pin >= QE_PIO_PINS)
  107. return -EINVAL;
  108. /* calculate pin location */
  109. pin_mask = (u32) (1 << (QE_PIO_PINS - 1 - pin));
  110. tmp_val = ioread32be(&par_io[port].cpdata);
  111. if (val == 0) /* clear */
  112. iowrite32be(~pin_mask & tmp_val, &par_io[port].cpdata);
  113. else /* set */
  114. iowrite32be(pin_mask | tmp_val, &par_io[port].cpdata);
  115. return 0;
  116. }
  117. EXPORT_SYMBOL(par_io_data_set);
  118. int par_io_of_config(struct device_node *np)
  119. {
  120. struct device_node *pio;
  121. int pio_map_len;
  122. const __be32 *pio_map;
  123. if (par_io == NULL) {
  124. printk(KERN_ERR "par_io not initialized\n");
  125. return -1;
  126. }
  127. pio = of_parse_phandle(np, "pio-handle", 0);
  128. if (pio == NULL) {
  129. printk(KERN_ERR "pio-handle not available\n");
  130. return -1;
  131. }
  132. pio_map = of_get_property(pio, "pio-map", &pio_map_len);
  133. if (pio_map == NULL) {
  134. printk(KERN_ERR "pio-map is not set!\n");
  135. return -1;
  136. }
  137. pio_map_len /= sizeof(unsigned int);
  138. if ((pio_map_len % 6) != 0) {
  139. printk(KERN_ERR "pio-map format wrong!\n");
  140. return -1;
  141. }
  142. while (pio_map_len > 0) {
  143. u8 port = be32_to_cpu(pio_map[0]);
  144. u8 pin = be32_to_cpu(pio_map[1]);
  145. int dir = be32_to_cpu(pio_map[2]);
  146. int open_drain = be32_to_cpu(pio_map[3]);
  147. int assignment = be32_to_cpu(pio_map[4]);
  148. int has_irq = be32_to_cpu(pio_map[5]);
  149. par_io_config_pin(port, pin, dir, open_drain,
  150. assignment, has_irq);
  151. pio_map += 6;
  152. pio_map_len -= 6;
  153. }
  154. of_node_put(pio);
  155. return 0;
  156. }
  157. EXPORT_SYMBOL(par_io_of_config);