2  * wm8350-core.c  --  Device access for Wolfson WM8350
 
   4  * Copyright 2007, 2008 Wolfson Microelectronics PLC.
 
   6  * Author: Liam Girdwood
 
   8  *  This program is free software; you can redistribute  it and/or modify it
 
   9  *  under  the terms of  the GNU General  Public License as published by the
 
  10  *  Free Software Foundation;  either version 2 of the  License, or (at your
 
  11  *  option) any later version.
 
  15 #include <linux/kernel.h>
 
  16 #include <linux/module.h>
 
  17 #include <linux/errno.h>
 
  19 #include <linux/mfd/wm8350/core.h>
 
  20 #include <linux/mfd/wm8350/gpio.h>
 
  21 #include <linux/mfd/wm8350/pmic.h>
 
  23 static int gpio_set_dir(struct wm8350 *wm8350, int gpio, int dir)
 
  27         wm8350_reg_unlock(wm8350);
 
  28         if (dir == WM8350_GPIO_DIR_OUT)
 
  29                 ret = wm8350_clear_bits(wm8350,
 
  30                                         WM8350_GPIO_CONFIGURATION_I_O,
 
  33                 ret = wm8350_set_bits(wm8350,
 
  34                                       WM8350_GPIO_CONFIGURATION_I_O,
 
  36         wm8350_reg_lock(wm8350);
 
  40 static int gpio_set_debounce(struct wm8350 *wm8350, int gpio, int db)
 
  42         if (db == WM8350_GPIO_DEBOUNCE_ON)
 
  43                 return wm8350_set_bits(wm8350, WM8350_GPIO_DEBOUNCE,
 
  46                 return wm8350_clear_bits(wm8350,
 
  47                                          WM8350_GPIO_DEBOUNCE, 1 << gpio);
 
  50 static int gpio_set_func(struct wm8350 *wm8350, int gpio, int func)
 
  54         wm8350_reg_unlock(wm8350);
 
  57                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_1)
 
  58                     & ~WM8350_GP0_FN_MASK;
 
  59                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_1,
 
  60                                  reg | ((func & 0xf) << 0));
 
  63                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_1)
 
  64                     & ~WM8350_GP1_FN_MASK;
 
  65                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_1,
 
  66                                  reg | ((func & 0xf) << 4));
 
  69                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_1)
 
  70                     & ~WM8350_GP2_FN_MASK;
 
  71                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_1,
 
  72                                  reg | ((func & 0xf) << 8));
 
  75                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_1)
 
  76                     & ~WM8350_GP3_FN_MASK;
 
  77                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_1,
 
  78                                  reg | ((func & 0xf) << 12));
 
  81                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_2)
 
  82                     & ~WM8350_GP4_FN_MASK;
 
  83                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_2,
 
  84                                  reg | ((func & 0xf) << 0));
 
  87                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_2)
 
  88                     & ~WM8350_GP5_FN_MASK;
 
  89                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_2,
 
  90                                  reg | ((func & 0xf) << 4));
 
  93                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_2)
 
  94                     & ~WM8350_GP6_FN_MASK;
 
  95                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_2,
 
  96                                  reg | ((func & 0xf) << 8));
 
  99                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_2)
 
 100                     & ~WM8350_GP7_FN_MASK;
 
 101                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_2,
 
 102                                  reg | ((func & 0xf) << 12));
 
 105                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_3)
 
 106                     & ~WM8350_GP8_FN_MASK;
 
 107                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_3,
 
 108                                  reg | ((func & 0xf) << 0));
 
 111                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_3)
 
 112                     & ~WM8350_GP9_FN_MASK;
 
 113                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_3,
 
 114                                  reg | ((func & 0xf) << 4));
 
 117                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_3)
 
 118                     & ~WM8350_GP10_FN_MASK;
 
 119                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_3,
 
 120                                  reg | ((func & 0xf) << 8));
 
 123                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_3)
 
 124                     & ~WM8350_GP11_FN_MASK;
 
 125                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_3,
 
 126                                  reg | ((func & 0xf) << 12));
 
 129                 reg = wm8350_reg_read(wm8350, WM8350_GPIO_FUNCTION_SELECT_4)
 
 130                     & ~WM8350_GP12_FN_MASK;
 
 131                 wm8350_reg_write(wm8350, WM8350_GPIO_FUNCTION_SELECT_4,
 
 132                                  reg | ((func & 0xf) << 0));
 
 135                 wm8350_reg_lock(wm8350);
 
 139         wm8350_reg_lock(wm8350);
 
 143 static int gpio_set_pull_up(struct wm8350 *wm8350, int gpio, int up)
 
 146                 return wm8350_set_bits(wm8350,
 
 147                                        WM8350_GPIO_PIN_PULL_UP_CONTROL,
 
 150                 return wm8350_clear_bits(wm8350,
 
 151                                          WM8350_GPIO_PIN_PULL_UP_CONTROL,
 
 155 static int gpio_set_pull_down(struct wm8350 *wm8350, int gpio, int down)
 
 158                 return wm8350_set_bits(wm8350,
 
 159                                        WM8350_GPIO_PULL_DOWN_CONTROL,
 
 162                 return wm8350_clear_bits(wm8350,
 
 163                                          WM8350_GPIO_PULL_DOWN_CONTROL,
 
 167 static int gpio_set_polarity(struct wm8350 *wm8350, int gpio, int pol)
 
 169         if (pol == WM8350_GPIO_ACTIVE_HIGH)
 
 170                 return wm8350_set_bits(wm8350,
 
 171                                        WM8350_GPIO_PIN_POLARITY_TYPE,
 
 174                 return wm8350_clear_bits(wm8350,
 
 175                                          WM8350_GPIO_PIN_POLARITY_TYPE,
 
 179 static int gpio_set_invert(struct wm8350 *wm8350, int gpio, int invert)
 
 181         if (invert == WM8350_GPIO_INVERT_ON)
 
 182                 return wm8350_set_bits(wm8350, WM8350_GPIO_INT_MODE, 1 << gpio);
 
 184                 return wm8350_clear_bits(wm8350,
 
 185                                          WM8350_GPIO_INT_MODE, 1 << gpio);
 
 188 int wm8350_gpio_config(struct wm8350 *wm8350, int gpio, int dir, int func,
 
 189                        int pol, int pull, int invert, int debounce)
 
 191         /* make sure we never pull up and down at the same time */
 
 192         if (pull == WM8350_GPIO_PULL_NONE) {
 
 193                 if (gpio_set_pull_up(wm8350, gpio, 0))
 
 195                 if (gpio_set_pull_down(wm8350, gpio, 0))
 
 197         } else if (pull == WM8350_GPIO_PULL_UP) {
 
 198                 if (gpio_set_pull_down(wm8350, gpio, 0))
 
 200                 if (gpio_set_pull_up(wm8350, gpio, 1))
 
 202         } else if (pull == WM8350_GPIO_PULL_DOWN) {
 
 203                 if (gpio_set_pull_up(wm8350, gpio, 0))
 
 205                 if (gpio_set_pull_down(wm8350, gpio, 1))
 
 209         if (gpio_set_invert(wm8350, gpio, invert))
 
 211         if (gpio_set_polarity(wm8350, gpio, pol))
 
 213         if (gpio_set_debounce(wm8350, gpio, debounce))
 
 215         if (gpio_set_dir(wm8350, gpio, dir))
 
 217         return gpio_set_func(wm8350, gpio, func);
 
 222 EXPORT_SYMBOL_GPL(wm8350_gpio_config);