1.1 --- a/pkg/devices/lib/gpio/src/jz4740.cc Sat Apr 27 23:46:28 2024 +0200
1.2 +++ b/pkg/devices/lib/gpio/src/jz4740.cc Sun Apr 28 18:37:08 2024 +0200
1.3 @@ -2,7 +2,7 @@
1.4 * GPIO driver for Ingenic JZ4740.
1.5 * (See below for additional copyright and licensing notices.)
1.6 *
1.7 - * Copyright (C) 2017, 2018, 2023 Paul Boddie <paul@boddie.org.uk>
1.8 + * Copyright (C) 2017, 2018, 2023, 2024 Paul Boddie <paul@boddie.org.uk>
1.9 *
1.10 * This program is free software; you can redistribute it and/or
1.11 * modify it under the terms of the GNU General Public License as
1.12 @@ -66,6 +66,17 @@
1.13
1.14
1.15
1.16 +// JZ4740 pull-up/down configuration.
1.17 +
1.18 +static struct gpio_port gpio_ports[] = {
1.19 + {0xffffffff, 0x00000000},
1.20 + {0xffffffff, 0x00000000},
1.21 + {0x7fffffff, 0x00000000},
1.22 + {0xdeffffff, 0x00000000},
1.23 +};
1.24 +
1.25 +
1.26 +
1.27 // IRQ control for each GPIO pin.
1.28
1.29 Gpio_jz4740_irq_pin::Gpio_jz4740_irq_pin(unsigned pin, Hw::Register_block<32> const ®s)
1.30 @@ -166,12 +177,12 @@
1.31
1.32 // Initialise the GPIO controller.
1.33
1.34 -Gpio_jz4740_chip::Gpio_jz4740_chip(l4_addr_t start, l4_addr_t end,
1.35 - unsigned nr_pins)
1.36 -: _start(start), _end(end),
1.37 - _nr_pins(nr_pins)
1.38 +Gpio_jz4740_chip::Gpio_jz4740_chip(l4_addr_t start, uint8_t port_number)
1.39 +: _nr_pins(32)
1.40 {
1.41 + _start = start + port_number * 0x100;
1.42 _regs = new Hw::Mmio_register_block<32>(_start);
1.43 + _pull_config = &gpio_ports[port_number];
1.44 }
1.45
1.46 // Return the value of a pin.
1.47 @@ -285,8 +296,11 @@
1.48 case Pull_none:
1.49 _regs[Pull_disable_set] = bitmap;
1.50 break;
1.51 + case Pull_down:
1.52 + _regs[Pull_disable_clear] = (bitmap & _pull_config->pull_downs);
1.53 + break;
1.54 case Pull_up:
1.55 - _regs[Pull_disable_clear] = bitmap;
1.56 + _regs[Pull_disable_clear] = (bitmap & _pull_config->pull_ups);
1.57 break;
1.58 default:
1.59 // Invalid pull-up/down mode for pin.
1.60 @@ -413,9 +427,9 @@
1.61
1.62 // C language interface functions.
1.63
1.64 -void *jz4740_gpio_init(l4_addr_t start, l4_addr_t end, unsigned pins)
1.65 +void *jz4740_gpio_init(l4_addr_t start, uint8_t port_number)
1.66 {
1.67 - return (void *) new Gpio_jz4740_chip(start, end, pins);
1.68 + return (void *) new Gpio_jz4740_chip(start, port_number);
1.69 }
1.70
1.71 void jz4740_gpio_setup(void *gpio, unsigned pin, unsigned mode, int value)