cambria_gpio.c revision 331722
1/*- 2 * Copyright (c) 2010, Andrew Thompson <thompsa@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice unmodified, this list of conditions, and the following 10 * disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28/* 29 * GPIO driver for Gateworks Cambria 30 * 31 * Note: 32 * The Cambria PLD does not set the i2c ack bit after each write, if we used the 33 * regular iicbus interface it would abort the xfer after the address byte 34 * times out and not write our latch. To get around this we grab the iicbus and 35 * then do our own bit banging. This is a compromise to changing all the iicbb 36 * device methods to allow a flag to be passed down and is similir to how Linux 37 * does it. 38 * 39 */ 40 41#include <sys/cdefs.h> 42__FBSDID("$FreeBSD: stable/11/sys/arm/xscale/ixp425/cambria_gpio.c 331722 2018-03-29 02:50:57Z eadler $"); 43 44#include <sys/param.h> 45#include <sys/systm.h> 46#include <sys/bus.h> 47 48#include <sys/kernel.h> 49#include <sys/module.h> 50#include <sys/rman.h> 51#include <sys/lock.h> 52#include <sys/mutex.h> 53#include <sys/gpio.h> 54 55#include <arm/xscale/ixp425/ixp425reg.h> 56#include <arm/xscale/ixp425/ixp425var.h> 57#include <arm/xscale/ixp425/ixdp425reg.h> 58 59#include <dev/gpio/gpiobusvar.h> 60#include <dev/iicbus/iiconf.h> 61#include <dev/iicbus/iicbus.h> 62 63#include "iicbb_if.h" 64#include "gpio_if.h" 65 66#define IIC_M_WR 0 /* write operation */ 67#define PLD_ADDR 0xac /* slave address */ 68 69#define I2C_DELAY 10 70 71#define GPIO_CONF_CLR(sc, reg, mask) \ 72 GPIO_CONF_WRITE_4(sc, reg, GPIO_CONF_READ_4(sc, reg) &~ (mask)) 73#define GPIO_CONF_SET(sc, reg, mask) \ 74 GPIO_CONF_WRITE_4(sc, reg, GPIO_CONF_READ_4(sc, reg) | (mask)) 75 76#define GPIO_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) 77#define GPIO_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) 78#define GPIO_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED) 79 80#define GPIO_PINS 5 81struct cambria_gpio_softc { 82 device_t sc_dev; 83 device_t sc_busdev; 84 bus_space_tag_t sc_iot; 85 bus_space_handle_t sc_gpio_ioh; 86 struct mtx sc_mtx; 87 struct gpio_pin sc_pins[GPIO_PINS]; 88 uint8_t sc_latch; 89 uint8_t sc_val; 90}; 91 92struct cambria_gpio_pin { 93 const char *name; 94 int pin; 95 int flags; 96}; 97 98extern struct ixp425_softc *ixp425_softc; 99 100static struct cambria_gpio_pin cambria_gpio_pins[GPIO_PINS] = { 101 { "PLD0", 0, GPIO_PIN_OUTPUT }, 102 { "PLD1", 1, GPIO_PIN_OUTPUT }, 103 { "PLD2", 2, GPIO_PIN_OUTPUT }, 104 { "PLD3", 3, GPIO_PIN_OUTPUT }, 105 { "PLD4", 4, GPIO_PIN_OUTPUT }, 106}; 107 108/* 109 * Helpers 110 */ 111static int cambria_gpio_read(struct cambria_gpio_softc *, uint32_t, unsigned int *); 112static int cambria_gpio_write(struct cambria_gpio_softc *); 113 114/* 115 * Driver stuff 116 */ 117static int cambria_gpio_probe(device_t dev); 118static int cambria_gpio_attach(device_t dev); 119static int cambria_gpio_detach(device_t dev); 120 121/* 122 * GPIO interface 123 */ 124static device_t cambria_gpio_get_bus(device_t); 125static int cambria_gpio_pin_max(device_t dev, int *maxpin); 126static int cambria_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps); 127static int cambria_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t 128 *flags); 129static int cambria_gpio_pin_getname(device_t dev, uint32_t pin, char *name); 130static int cambria_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags); 131static int cambria_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value); 132static int cambria_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val); 133static int cambria_gpio_pin_toggle(device_t dev, uint32_t pin); 134 135static int 136i2c_getsda(struct cambria_gpio_softc *sc) 137{ 138 uint32_t reg; 139 140 IXP4XX_GPIO_LOCK(); 141 GPIO_CONF_SET(sc, IXP425_GPIO_GPOER, GPIO_I2C_SDA_BIT); 142 143 reg = GPIO_CONF_READ_4(sc, IXP425_GPIO_GPINR); 144 IXP4XX_GPIO_UNLOCK(); 145 return (reg & GPIO_I2C_SDA_BIT); 146} 147 148static void 149i2c_setsda(struct cambria_gpio_softc *sc, int val) 150{ 151 152 IXP4XX_GPIO_LOCK(); 153 GPIO_CONF_CLR(sc, IXP425_GPIO_GPOUTR, GPIO_I2C_SDA_BIT); 154 if (val) 155 GPIO_CONF_SET(sc, IXP425_GPIO_GPOER, GPIO_I2C_SDA_BIT); 156 else 157 GPIO_CONF_CLR(sc, IXP425_GPIO_GPOER, GPIO_I2C_SDA_BIT); 158 IXP4XX_GPIO_UNLOCK(); 159 DELAY(I2C_DELAY); 160} 161 162static void 163i2c_setscl(struct cambria_gpio_softc *sc, int val) 164{ 165 166 IXP4XX_GPIO_LOCK(); 167 GPIO_CONF_CLR(sc, IXP425_GPIO_GPOUTR, GPIO_I2C_SCL_BIT); 168 if (val) 169 GPIO_CONF_SET(sc, IXP425_GPIO_GPOER, GPIO_I2C_SCL_BIT); 170 else 171 GPIO_CONF_CLR(sc, IXP425_GPIO_GPOER, GPIO_I2C_SCL_BIT); 172 IXP4XX_GPIO_UNLOCK(); 173 DELAY(I2C_DELAY); 174} 175 176static void 177i2c_sendstart(struct cambria_gpio_softc *sc) 178{ 179 i2c_setsda(sc, 1); 180 i2c_setscl(sc, 1); 181 i2c_setsda(sc, 0); 182 i2c_setscl(sc, 0); 183} 184 185static void 186i2c_sendstop(struct cambria_gpio_softc *sc) 187{ 188 i2c_setscl(sc, 1); 189 i2c_setsda(sc, 1); 190 i2c_setscl(sc, 0); 191 i2c_setsda(sc, 0); 192} 193 194static void 195i2c_sendbyte(struct cambria_gpio_softc *sc, u_char data) 196{ 197 int i; 198 199 for (i=7; i>=0; i--) { 200 i2c_setsda(sc, data & (1<<i)); 201 i2c_setscl(sc, 1); 202 i2c_setscl(sc, 0); 203 } 204 i2c_setscl(sc, 1); 205 i2c_getsda(sc); 206 i2c_setscl(sc, 0); 207} 208 209static u_char 210i2c_readbyte(struct cambria_gpio_softc *sc) 211{ 212 int i; 213 unsigned char data=0; 214 215 for (i=7; i>=0; i--) 216 { 217 i2c_setscl(sc, 1); 218 if (i2c_getsda(sc)) 219 data |= (1<<i); 220 i2c_setscl(sc, 0); 221 } 222 return data; 223} 224 225static int 226cambria_gpio_read(struct cambria_gpio_softc *sc, uint32_t pin, unsigned int *val) 227{ 228 device_t dev = sc->sc_dev; 229 int error; 230 231 error = iicbus_request_bus(device_get_parent(dev), dev, 232 IIC_DONTWAIT); 233 if (error) 234 return (error); 235 236 i2c_sendstart(sc); 237 i2c_sendbyte(sc, PLD_ADDR | LSB); 238 *val = (i2c_readbyte(sc) & (1 << pin)) != 0; 239 i2c_sendstop(sc); 240 241 iicbus_release_bus(device_get_parent(dev), dev); 242 243 return (0); 244} 245 246static int 247cambria_gpio_write(struct cambria_gpio_softc *sc) 248{ 249 device_t dev = sc->sc_dev; 250 int error; 251 252 error = iicbus_request_bus(device_get_parent(dev), dev, 253 IIC_DONTWAIT); 254 if (error) 255 return (error); 256 257 i2c_sendstart(sc); 258 i2c_sendbyte(sc, PLD_ADDR & ~LSB); 259 i2c_sendbyte(sc, sc->sc_latch); 260 i2c_sendstop(sc); 261 262 iicbus_release_bus(device_get_parent(dev), dev); 263 264 return (0); 265} 266 267static device_t 268cambria_gpio_get_bus(device_t dev) 269{ 270 struct cambria_gpio_softc *sc; 271 272 sc = device_get_softc(dev); 273 274 return (sc->sc_busdev); 275} 276 277static int 278cambria_gpio_pin_max(device_t dev, int *maxpin) 279{ 280 281 *maxpin = GPIO_PINS - 1; 282 return (0); 283} 284 285static int 286cambria_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps) 287{ 288 struct cambria_gpio_softc *sc = device_get_softc(dev); 289 290 if (pin >= GPIO_PINS) 291 return (EINVAL); 292 293 *caps = sc->sc_pins[pin].gp_caps; 294 return (0); 295} 296 297static int 298cambria_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags) 299{ 300 struct cambria_gpio_softc *sc = device_get_softc(dev); 301 302 if (pin >= GPIO_PINS) 303 return (EINVAL); 304 305 *flags = sc->sc_pins[pin].gp_flags; 306 return (0); 307} 308 309static int 310cambria_gpio_pin_getname(device_t dev, uint32_t pin, char *name) 311{ 312 struct cambria_gpio_softc *sc = device_get_softc(dev); 313 314 if (pin >= GPIO_PINS) 315 return (EINVAL); 316 317 memcpy(name, sc->sc_pins[pin].gp_name, GPIOMAXNAME); 318 return (0); 319} 320 321static int 322cambria_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags) 323{ 324 struct cambria_gpio_softc *sc = device_get_softc(dev); 325 int error; 326 uint8_t mask; 327 328 mask = 1 << pin; 329 330 if (pin >= GPIO_PINS) 331 return (EINVAL); 332 333 GPIO_LOCK(sc); 334 sc->sc_pins[pin].gp_flags = flags; 335 336 /* 337 * Writing a logical one sets the signal high and writing a logical 338 * zero sets the signal low. To configure a digital I/O signal as an 339 * input, a logical one must first be written to the data bit to 340 * three-state the associated output. 341 */ 342 if (flags & GPIO_PIN_INPUT || sc->sc_val & mask) 343 sc->sc_latch |= mask; /* input or output & high */ 344 else 345 sc->sc_latch &= ~mask; 346 error = cambria_gpio_write(sc); 347 GPIO_UNLOCK(sc); 348 349 return (error); 350} 351 352static int 353cambria_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value) 354{ 355 struct cambria_gpio_softc *sc = device_get_softc(dev); 356 int error; 357 uint8_t mask; 358 359 mask = 1 << pin; 360 361 if (pin >= GPIO_PINS) 362 return (EINVAL); 363 GPIO_LOCK(sc); 364 if (value) 365 sc->sc_val |= mask; 366 else 367 sc->sc_val &= ~mask; 368 369 if (sc->sc_pins[pin].gp_flags != GPIO_PIN_OUTPUT) { 370 /* just save, altering the latch will disable input */ 371 GPIO_UNLOCK(sc); 372 return (0); 373 } 374 375 if (value) 376 sc->sc_latch |= mask; 377 else 378 sc->sc_latch &= ~mask; 379 error = cambria_gpio_write(sc); 380 GPIO_UNLOCK(sc); 381 382 return (error); 383} 384 385static int 386cambria_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val) 387{ 388 struct cambria_gpio_softc *sc = device_get_softc(dev); 389 int error = 0; 390 391 if (pin >= GPIO_PINS) 392 return (EINVAL); 393 394 GPIO_LOCK(sc); 395 if (sc->sc_pins[pin].gp_flags == GPIO_PIN_OUTPUT) 396 *val = (sc->sc_latch & (1 << pin)) ? 1 : 0; 397 else 398 error = cambria_gpio_read(sc, pin, val); 399 GPIO_UNLOCK(sc); 400 401 return (error); 402} 403 404static int 405cambria_gpio_pin_toggle(device_t dev, uint32_t pin) 406{ 407 struct cambria_gpio_softc *sc = device_get_softc(dev); 408 int error = 0; 409 410 if (pin >= GPIO_PINS) 411 return (EINVAL); 412 413 GPIO_LOCK(sc); 414 sc->sc_val ^= (1 << pin); 415 if (sc->sc_pins[pin].gp_flags == GPIO_PIN_OUTPUT) { 416 sc->sc_latch ^= (1 << pin); 417 error = cambria_gpio_write(sc); 418 } 419 GPIO_UNLOCK(sc); 420 421 return (error); 422} 423 424static int 425cambria_gpio_probe(device_t dev) 426{ 427 428 device_set_desc(dev, "Gateworks Cambria GPIO driver"); 429 return (0); 430} 431 432static int 433cambria_gpio_attach(device_t dev) 434{ 435 struct cambria_gpio_softc *sc = device_get_softc(dev); 436 int pin; 437 438 sc->sc_dev = dev; 439 sc->sc_iot = ixp425_softc->sc_iot; 440 sc->sc_gpio_ioh = ixp425_softc->sc_gpio_ioh; 441 442 mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF); 443 444 for (pin = 0; pin < GPIO_PINS; pin++) { 445 struct cambria_gpio_pin *p = &cambria_gpio_pins[pin]; 446 447 strncpy(sc->sc_pins[pin].gp_name, p->name, GPIOMAXNAME); 448 sc->sc_pins[pin].gp_pin = pin; 449 sc->sc_pins[pin].gp_caps = GPIO_PIN_INPUT|GPIO_PIN_OUTPUT; 450 sc->sc_pins[pin].gp_flags = 0; 451 cambria_gpio_pin_setflags(dev, pin, p->flags); 452 } 453 454 sc->sc_busdev = gpiobus_attach_bus(dev); 455 if (sc->sc_busdev == NULL) { 456 mtx_destroy(&sc->sc_mtx); 457 return (ENXIO); 458 } 459 460 return (0); 461} 462 463static int 464cambria_gpio_detach(device_t dev) 465{ 466 struct cambria_gpio_softc *sc = device_get_softc(dev); 467 468 KASSERT(mtx_initialized(&sc->sc_mtx), ("gpio mutex not initialized")); 469 470 gpiobus_detach_bus(dev); 471 mtx_destroy(&sc->sc_mtx); 472 473 return(0); 474} 475 476static device_method_t cambria_gpio_methods[] = { 477 DEVMETHOD(device_probe, cambria_gpio_probe), 478 DEVMETHOD(device_attach, cambria_gpio_attach), 479 DEVMETHOD(device_detach, cambria_gpio_detach), 480 481 /* GPIO protocol */ 482 DEVMETHOD(gpio_get_bus, cambria_gpio_get_bus), 483 DEVMETHOD(gpio_pin_max, cambria_gpio_pin_max), 484 DEVMETHOD(gpio_pin_getname, cambria_gpio_pin_getname), 485 DEVMETHOD(gpio_pin_getflags, cambria_gpio_pin_getflags), 486 DEVMETHOD(gpio_pin_getcaps, cambria_gpio_pin_getcaps), 487 DEVMETHOD(gpio_pin_setflags, cambria_gpio_pin_setflags), 488 DEVMETHOD(gpio_pin_get, cambria_gpio_pin_get), 489 DEVMETHOD(gpio_pin_set, cambria_gpio_pin_set), 490 DEVMETHOD(gpio_pin_toggle, cambria_gpio_pin_toggle), 491 {0, 0}, 492}; 493 494static driver_t cambria_gpio_driver = { 495 "gpio", 496 cambria_gpio_methods, 497 sizeof(struct cambria_gpio_softc), 498}; 499static devclass_t cambria_gpio_devclass; 500 501DRIVER_MODULE(gpio_cambria, iicbus, cambria_gpio_driver, cambria_gpio_devclass, 0, 0); 502MODULE_VERSION(gpio_cambria, 1); 503MODULE_DEPEND(gpio_cambria, iicbus, 1, 1, 1); 504