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