diff options
| author | Robert Dolca <robert.dolca@intel.com> | 2015-01-26 06:13:36 -0500 |
|---|---|---|
| committer | Samuel Ortiz <sameo@linux.intel.com> | 2015-01-27 18:16:23 -0500 |
| commit | 75dda421a31dc614b8b6502cafd3825e2c72ccf0 (patch) | |
| tree | e37ff146bf4f97c2fecc74ac52761da0fbad2b31 /drivers/nfc | |
| parent | 3b060532621ef52e9e58c7596868c2570229a47b (diff) | |
NFC: PN544: GPIO access that may sleep
gpio_set_value was replaced with gpio_set_value_cansleep in order
to allow GPIO access that may sleep. This is particularelly useful
when GPIO is accessed using busses like I2C, SPI, USB
Signed-off-by: Robert Dolca <robert.dolca@intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/nfc')
| -rw-r--r-- | drivers/nfc/pn544/i2c.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/drivers/nfc/pn544/i2c.c b/drivers/nfc/pn544/i2c.c index fc02e8d6a193..d9018cda6c7f 100644 --- a/drivers/nfc/pn544/i2c.c +++ b/drivers/nfc/pn544/i2c.c | |||
| @@ -195,18 +195,19 @@ static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy) | |||
| 195 | nfc_info(&phy->i2c_dev->dev, "Detecting nfc_en polarity\n"); | 195 | nfc_info(&phy->i2c_dev->dev, "Detecting nfc_en polarity\n"); |
| 196 | 196 | ||
| 197 | /* Disable fw download */ | 197 | /* Disable fw download */ |
| 198 | gpio_set_value(phy->gpio_fw, 0); | 198 | gpio_set_value_cansleep(phy->gpio_fw, 0); |
| 199 | 199 | ||
| 200 | for (polarity = 0; polarity < 2; polarity++) { | 200 | for (polarity = 0; polarity < 2; polarity++) { |
| 201 | phy->en_polarity = polarity; | 201 | phy->en_polarity = polarity; |
| 202 | retry = 3; | 202 | retry = 3; |
| 203 | while (retry--) { | 203 | while (retry--) { |
| 204 | /* power off */ | 204 | /* power off */ |
| 205 | gpio_set_value(phy->gpio_en, !phy->en_polarity); | 205 | gpio_set_value_cansleep(phy->gpio_en, |
| 206 | !phy->en_polarity); | ||
| 206 | usleep_range(10000, 15000); | 207 | usleep_range(10000, 15000); |
| 207 | 208 | ||
| 208 | /* power on */ | 209 | /* power on */ |
| 209 | gpio_set_value(phy->gpio_en, phy->en_polarity); | 210 | gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity); |
| 210 | usleep_range(10000, 15000); | 211 | usleep_range(10000, 15000); |
| 211 | 212 | ||
| 212 | /* send reset */ | 213 | /* send reset */ |
| @@ -225,13 +226,14 @@ static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy) | |||
| 225 | "Could not detect nfc_en polarity, fallback to active high\n"); | 226 | "Could not detect nfc_en polarity, fallback to active high\n"); |
| 226 | 227 | ||
| 227 | out: | 228 | out: |
| 228 | gpio_set_value(phy->gpio_en, !phy->en_polarity); | 229 | gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity); |
| 229 | } | 230 | } |
| 230 | 231 | ||
| 231 | static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode) | 232 | static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode) |
| 232 | { | 233 | { |
| 233 | gpio_set_value(phy->gpio_fw, run_mode == PN544_FW_MODE ? 1 : 0); | 234 | gpio_set_value_cansleep(phy->gpio_fw, |
| 234 | gpio_set_value(phy->gpio_en, phy->en_polarity); | 235 | run_mode == PN544_FW_MODE ? 1 : 0); |
| 236 | gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity); | ||
| 235 | usleep_range(10000, 15000); | 237 | usleep_range(10000, 15000); |
| 236 | 238 | ||
| 237 | phy->run_mode = run_mode; | 239 | phy->run_mode = run_mode; |
| @@ -254,14 +256,14 @@ static void pn544_hci_i2c_disable(void *phy_id) | |||
| 254 | { | 256 | { |
| 255 | struct pn544_i2c_phy *phy = phy_id; | 257 | struct pn544_i2c_phy *phy = phy_id; |
| 256 | 258 | ||
| 257 | gpio_set_value(phy->gpio_fw, 0); | 259 | gpio_set_value_cansleep(phy->gpio_fw, 0); |
| 258 | gpio_set_value(phy->gpio_en, !phy->en_polarity); | 260 | gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity); |
| 259 | usleep_range(10000, 15000); | 261 | usleep_range(10000, 15000); |
| 260 | 262 | ||
| 261 | gpio_set_value(phy->gpio_en, phy->en_polarity); | 263 | gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity); |
| 262 | usleep_range(10000, 15000); | 264 | usleep_range(10000, 15000); |
| 263 | 265 | ||
| 264 | gpio_set_value(phy->gpio_en, !phy->en_polarity); | 266 | gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity); |
| 265 | usleep_range(10000, 15000); | 267 | usleep_range(10000, 15000); |
| 266 | 268 | ||
| 267 | phy->powered = 0; | 269 | phy->powered = 0; |
