int gpio_init(void) { verify_gpio_map(); int fd = open("/dev/mem", O_RDWR); int status = 0; int ret; if (fd == -1) { fprintf(stderr, "failed to open /dev/mem: %s\n", strerror(errno)); return errno; } ret = gpio_mmap(fd); if (ret) { fprintf(stderr, "failed to mmap gpio banks: %s\n", strerror(errno)); status = errno; goto ret_close; } ret = gpio_clock_enable(fd); if (ret) { fprintf(stderr, "failed to enable gpio clocks: %s\n", strerror(errno)); status = errno; goto ret_close; } ret_close: close(fd); return status; }
static void gp_gpio_resume_set( void ) { int* ptr; if( g_gpio_regSave != 0 ) { gpio_clock_enable(1); ptr = (int *)g_gpio_regSave; gpHalGpioRegRestore( ptr ); kfree( ptr ); g_gpio_regSave = 0; } }
static void gp_gpio_suspend_set( void ) { int* ptr; if( g_gpio_regSave == 0 ) { ptr = kmalloc( 260, GFP_KERNEL); gpHalGpioRegSave( ptr ); g_gpio_regSave = (int)ptr; if( ptr == NULL ) { printk("[%s][%d]Suspend Error, it allocates memory fail\n", __FUNCTION__, __LINE__); } gpio_clock_enable(0); } }
/** * @brief Gpio driver exit function */ static void __exit gpio_exit(void) { misc_deregister(&gpio->dev); //gpHalGpioClkEnable(0); gpio_clock_enable(0); free_irq(gpio_irqs[4], gpio); free_irq(gpio_irqs[3], gpio); free_irq(gpio_irqs[2], gpio); free_irq(gpio_irqs[1], gpio); free_irq(gpio_irqs[0], gpio); kfree(gpio); gpio = NULL; platform_device_unregister(&gp_gpio_device); platform_driver_unregister(&gp_gpio_driver); }
/** * @brief Gpio driver init function */ static int __init gpio_init(void) { int ret = -ENXIO; gpio = (gpio_info_t *)kzalloc(sizeof(gpio_info_t), GFP_KERNEL); if (gpio == NULL) { ret = -ENOMEM; DIAG_ERROR("gpio kmalloc fail\n"); goto fail_kmalloc; } /* request irq */ ret = request_irq(gpio_irqs[0], gpio_irq_handler, 0, "GPIO_0", gpio); if (ret < 0) { DIAG_ERROR("request irq GPIO_0 fail\n"); goto fail_request_irq_gpio_0; } ret = request_irq(gpio_irqs[1], gpio_irq_handler, 0, "GPIO_1", gpio); if (ret < 0) { DIAG_ERROR("request irq GPIO_1 fail\n"); goto fail_request_irq_gpio_1; } ret = request_irq(gpio_irqs[2], gpio_irq_handler, 0, "GPIO_2", gpio); if (ret < 0) { DIAG_ERROR("request irq GPIO_2 fail\n"); goto fail_request_irq_gpio_2; } ret = request_irq(gpio_irqs[3], gpio_irq_handler, 0, "GPIO_3", gpio); if (ret < 0) { DIAG_ERROR("request irq GPIO_3 fail\n"); goto fail_request_irq_gpio_3; } ret = request_irq(gpio_irqs[4], gpio_irq_handler, 0, "GPIO_4", gpio); if (ret < 0) { DIAG_ERROR("request irq GPIO_4 fail\n"); goto fail_request_irq_gpio_4; } /* initliaze */ init_MUTEX(&gpio->sem); //gpHalGpioClkEnable(1); gpio_clock_enable(1); /* register device */ gpio->dev.name = "gpio"; gpio->dev.minor = MISC_DYNAMIC_MINOR; gpio->dev.fops = &gpio_fops; ret = misc_register(&gpio->dev); if (ret != 0) { DIAG_ERROR("gpio device register fail\n"); goto fail_device_register; } platform_device_register(&gp_gpio_device); return platform_driver_register(&gp_gpio_driver); /* error rollback */ fail_device_register: gpio_clock_enable(0); free_irq(gpio_irqs[4], gpio); fail_request_irq_gpio_4: free_irq(gpio_irqs[3], gpio); fail_request_irq_gpio_3: free_irq(gpio_irqs[2], gpio); fail_request_irq_gpio_2: free_irq(gpio_irqs[1], gpio); fail_request_irq_gpio_1: free_irq(gpio_irqs[0], gpio); fail_request_irq_gpio_0: kfree(gpio); gpio = NULL; fail_kmalloc: return ret; }