realtek: fix RTL8231 gpio expander for high GPIOs
GPIOs > 31 require special handling. This patch fixes both the initialisation and direction get/set operations. Signed-off-by: Paul Fertser <fercerpav@gmail.com> Reviewed-by: Sander Vanheule <sander@svanheule.net>
This commit is contained in:
parent
8ea0d08e0e
commit
16ae56b4f9
@ -106,12 +106,11 @@ static int rtl8231_pin_dir(struct rtl8231_gpios *gpios, u32 gpio, u32 dir)
|
|||||||
u32 v;
|
u32 v;
|
||||||
int pin_sel_addr = RTL8231_GPIO_PIN_SEL(gpio);
|
int pin_sel_addr = RTL8231_GPIO_PIN_SEL(gpio);
|
||||||
int pin_dir_addr = RTL8231_GPIO_DIR(gpio);
|
int pin_dir_addr = RTL8231_GPIO_DIR(gpio);
|
||||||
int pin = gpio % 16;
|
int dpin = gpio % 16;
|
||||||
int dpin = pin;
|
|
||||||
|
|
||||||
if (gpio > 31) {
|
if (gpio > 31) {
|
||||||
pr_debug("WARNING: HIGH pin\n");
|
pr_debug("WARNING: HIGH pin\n");
|
||||||
dpin = pin << 5;
|
dpin += 5;
|
||||||
pin_dir_addr = pin_sel_addr;
|
pin_dir_addr = pin_sel_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,7 +139,7 @@ static int rtl8231_pin_dir_get(struct rtl8231_gpios *gpios, u32 gpio, u32 *dir)
|
|||||||
|
|
||||||
if (gpio > 31) {
|
if (gpio > 31) {
|
||||||
pin_dir_addr = RTL8231_GPIO_PIN_SEL(gpio);
|
pin_dir_addr = RTL8231_GPIO_PIN_SEL(gpio);
|
||||||
pin = pin << 5;
|
pin += 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
v = rtl8231_read(gpios, pin_dir_addr);
|
v = rtl8231_read(gpios, pin_dir_addr);
|
||||||
@ -240,6 +239,8 @@ void rtl8231_gpio_set(struct gpio_chip *gc, unsigned int offset, int value)
|
|||||||
|
|
||||||
int rtl8231_init(struct rtl8231_gpios *gpios)
|
int rtl8231_init(struct rtl8231_gpios *gpios)
|
||||||
{
|
{
|
||||||
|
u32 v;
|
||||||
|
|
||||||
pr_info("%s called, MDIO bus ID: %d\n", __func__, gpios->smi_bus_id);
|
pr_info("%s called, MDIO bus ID: %d\n", __func__, gpios->smi_bus_id);
|
||||||
|
|
||||||
gpios->reg_cached = 0;
|
gpios->reg_cached = 0;
|
||||||
@ -253,9 +254,11 @@ int rtl8231_init(struct rtl8231_gpios *gpios)
|
|||||||
sw_w32_mask(3, 1, RTL838X_DMY_REG5);
|
sw_w32_mask(3, 1, RTL838X_DMY_REG5);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Select GPIO functionality for pins 0-15, 16-31 and 32-37 */
|
/* Select GPIO functionality for pins 0-34 */
|
||||||
rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(0), 0xffff);
|
rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(0), 0xffff);
|
||||||
rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(16), 0xffff);
|
rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(16), 0xffff);
|
||||||
|
v = rtl8231_read(gpios, RTL8231_GPIO_PIN_SEL(32));
|
||||||
|
rtl8231_write(gpios, RTL8231_GPIO_PIN_SEL(32), v | 0x7);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user