1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2011 4 * eInfochips Ltd. <www.einfochips.com> 5 * Written-by: Ajay Bhargav <contact@8051projects.net> 6 * 7 * (C) Copyright 2010 8 * Marvell Semiconductor <www.marvell.com> 9 */ 10 11 #include <common.h> 12 #include <asm/io.h> 13 #include <linux/errno.h> 14 #include "mvgpio.h" 15 #include <asm/gpio.h> 16 17 #ifndef MV_MAX_GPIO 18 #define MV_MAX_GPIO 128 19 #endif 20 21 int gpio_request(unsigned gpio, const char *label) 22 { 23 if (gpio >= MV_MAX_GPIO) { 24 printf("%s: Invalid GPIO requested %d\n", __func__, gpio); 25 return -1; 26 } 27 return 0; 28 } 29 30 int gpio_free(unsigned gpio) 31 { 32 return 0; 33 } 34 35 int gpio_direction_input(unsigned gpio) 36 { 37 struct gpio_reg *gpio_reg_bank; 38 39 if (gpio >= MV_MAX_GPIO) { 40 printf("%s: Invalid GPIO %d\n", __func__, gpio); 41 return -1; 42 } 43 44 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio)); 45 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gcdr); 46 return 0; 47 } 48 49 int gpio_direction_output(unsigned gpio, int value) 50 { 51 struct gpio_reg *gpio_reg_bank; 52 53 if (gpio >= MV_MAX_GPIO) { 54 printf("%s: Invalid GPIO %d\n", __func__, gpio); 55 return -1; 56 } 57 58 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio)); 59 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gsdr); 60 gpio_set_value(gpio, value); 61 return 0; 62 } 63 64 int gpio_get_value(unsigned gpio) 65 { 66 struct gpio_reg *gpio_reg_bank; 67 u32 gpio_val; 68 69 if (gpio >= MV_MAX_GPIO) { 70 printf("%s: Invalid GPIO %d\n", __func__, gpio); 71 return -1; 72 } 73 74 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio)); 75 gpio_val = readl(&gpio_reg_bank->gplr); 76 77 return GPIO_VAL(gpio, gpio_val); 78 } 79 80 int gpio_set_value(unsigned gpio, int value) 81 { 82 struct gpio_reg *gpio_reg_bank; 83 84 if (gpio >= MV_MAX_GPIO) { 85 printf("%s: Invalid GPIO %d\n", __func__, gpio); 86 return -1; 87 } 88 89 gpio_reg_bank = get_gpio_base(GPIO_TO_REG(gpio)); 90 if (value) 91 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpsr); 92 else 93 writel(GPIO_TO_BIT(gpio), &gpio_reg_bank->gpcr); 94 95 return 0; 96 } 97