aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
Commit message (Expand)AuthorAge
* Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6Linus Torvalds2008-04-21
|\
| * SCSI: convert struct class_device to struct deviceTony Jones2008-04-19
* | Merge branch 'semaphore' of git://git.kernel.org/pub/scm/linux/kernel/git/wil...Linus Torvalds2008-04-21
|\ \
| * | drivers: Remove unnecessary inclusions of asm/semaphore.hMatthew Wilcox2008-04-18
| |/
* | Merge branch 'merge-fixes' into develRussell King2008-04-19
|\|
| * Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6Linus Torvalds2008-04-18
| |\
| | * [SCSI] libata: use scsi_build_sense_bufferFUJITA Tomonori2008-04-07
| * | libata: fix boot panic with SATAPI devices on non-SFF HBAsJames Bottomley2008-04-18
| * | ata-acpi: don't call _GTF for disabled driveShaohua Li2008-04-17
| * | sata_mv add temporary 3 second init delay for SiliconImage PMsMark Lord2008-04-17
| * | sata_mv remove redundant edma init codeMark Lord2008-04-17
| * | sata_mv add basic port multiplier supportMark Lord2008-04-17
| * | sata_mv fix SOC flags, enable NCQ on SOCMark Lord2008-04-17
| * | sata_mv disable hotplug for nowMark Lord2008-04-17
| * | sata_mv cosmeticsMark Lord2008-04-17
| * | sata_mv hardreset reworkMark Lord2008-04-17
| * | [libata] improve Kconfig help text for new PMP, SFF optionsJeff Garzik2008-04-17
| * | libata: make EH fail gracefully if no reset method is availableTejun Heo2008-04-17
| * | libata: Be a bit more slack about early devicesAlan Cox2008-04-17
| * | libata: cable logicAlan Cox2008-04-17
| * | libata: move link onlineness check out of softreset methodsTejun Heo2008-04-17
| * | libata: kill dead code paths in reset pathTejun Heo2008-04-17
| * | pata_scc: fix build breakageStephen Rothwell2008-04-17
| * | libata: make PMP support optionalTejun Heo2008-04-17
| * | libata: implement PMP helpersTejun Heo2008-04-17
| * | libata: separate PMP support code from core codeTejun Heo2008-04-17
| * | libata: make SFF support optionalTejun Heo2008-04-17
| * | libata: don't use ap->ioaddr in non-SFF driversTejun Heo2008-04-17
| * | libata: clean up dummy port_opsTejun Heo2008-04-17
| * | libata: kill ata_noop_dev_select()Tejun Heo2008-04-17
| * | libata: remove check_status from non-SFF driversTejun Heo2008-04-17
| * | libata: replace tf_read with qc_fill_rtf for non-SFF driversTejun Heo2008-04-17
| * | libata: drop @finish_qc from ata_qc_complete_multiple()Tejun Heo2008-04-17
| * | libata: add qc_fill_rtf port operationTejun Heo2008-04-17
| * | libata: unify mechanism to request follow-up SRSTTejun Heo2008-04-17
| * | libata: move PMP SCR access failure during reset to ata_eh_reset()Tejun Heo2008-04-17
| * | libata: clear SError after link resumeTejun Heo2008-04-17
| * | libata: implement and use sata_std_hardreset()Tejun Heo2008-04-17
| * | libata: move generic hardreset code from sata_sff_hardreset() to sata_link_ha...Tejun Heo2008-04-17
| * | ahci: use ata_wait_after_reset() instead of ata_sff_wait_ready()Tejun Heo2008-04-17
| * | libata: separate out ata_wait_ready() and implement ata_wait_after_reset()Tejun Heo2008-04-17
| * | libata: restructure SFF post-reset readiness waitsTejun Heo2008-04-17
| * | libata: separate out ata_std_postreset() from ata_sff_postreset()Tejun Heo2008-04-17
| * | libata: separate out ata_std_prereset() from ata_sff_prereset()Tejun Heo2008-04-17
| * | libata: clean up port_ops->sff_irq_clear()Tejun Heo2008-04-17
| * | libata: rename SFF port opsTejun Heo2008-04-17
| * | libata: rename SFF functionsTejun Heo2008-04-17
| * | sata_mv fix ifctl handlingMark Lord2008-04-17
| * | sata_mv clean up mv_stop_edma usageMark Lord2008-04-17
| * | sata_mv cosmetic fixesMark Lord2008-04-17
an> DA9052_GPIO_0_1_REG + (offset >> 1)); if (ret < 0) return ret; if (da9052_gpio_port_odd(offset)) { da9052_port_direction = ret & DA9052_GPIO_ODD_PORT_PIN; da9052_port_direction >>= 4; } else { da9052_port_direction = ret & DA9052_GPIO_EVEN_PORT_PIN; } switch (da9052_port_direction) { case DA9052_INPUT: if (offset < DA9052_GPIO_MAX_PORTS_PER_REGISTER) ret = da9052_reg_read(gpio->da9052, DA9052_STATUS_C_REG); else ret = da9052_reg_read(gpio->da9052, DA9052_STATUS_D_REG); if (ret < 0) return ret; if (ret & (1 << DA9052_GPIO_SHIFT_COUNT(offset))) return 1; else return 0; case DA9052_OUTPUT_PUSHPULL: if (da9052_gpio_port_odd(offset)) return ret & DA9052_GPIO_ODD_PORT_MODE; else return ret & DA9052_GPIO_EVEN_PORT_MODE; default: return -EINVAL; } } static void da9052_gpio_set(struct gpio_chip *gc, unsigned offset, int value) { struct da9052_gpio *gpio = to_da9052_gpio(gc); int ret; if (da9052_gpio_port_odd(offset)) { ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_ODD_PORT_MODE, value << DA9052_GPIO_ODD_SHIFT); if (ret != 0) dev_err(gpio->da9052->dev, "Failed to updated gpio odd reg,%d", ret); } else { ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_EVEN_PORT_MODE, value << DA9052_GPIO_EVEN_SHIFT); if (ret != 0) dev_err(gpio->da9052->dev, "Failed to updated gpio even reg,%d", ret); } } static int da9052_gpio_direction_input(struct gpio_chip *gc, unsigned offset) { struct da9052_gpio *gpio = to_da9052_gpio(gc); unsigned char register_value; int ret; /* Format: function - 2 bits type - 1 bit mode - 1 bit */ register_value = DA9052_INPUT | DA9052_ACTIVE_LOW << 2 | DA9052_DEBOUNCING_ON << 3; if (da9052_gpio_port_odd(offset)) ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_MASK_UPPER_NIBBLE, (register_value << DA9052_GPIO_NIBBLE_SHIFT)); else ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_MASK_LOWER_NIBBLE, register_value); return ret; } static int da9052_gpio_direction_output(struct gpio_chip *gc, unsigned offset, int value) { struct da9052_gpio *gpio = to_da9052_gpio(gc); unsigned char register_value; int ret; /* Format: Function - 2 bits Type - 1 bit Mode - 1 bit */ register_value = DA9052_OUTPUT_PUSHPULL | DA9052_SUPPLY_VDD_IO1 << 2 | value << 3; if (da9052_gpio_port_odd(offset)) ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_MASK_UPPER_NIBBLE, (register_value << DA9052_GPIO_NIBBLE_SHIFT)); else ret = da9052_reg_update(gpio->da9052, (offset >> 1) + DA9052_GPIO_0_1_REG, DA9052_GPIO_MASK_LOWER_NIBBLE, register_value); return ret; } static int da9052_gpio_to_irq(struct gpio_chip *gc, u32 offset) { struct da9052_gpio *gpio = to_da9052_gpio(gc); struct da9052 *da9052 = gpio->da9052; return da9052->irq_base + DA9052_IRQ_GPI0 + offset; } static struct gpio_chip reference_gp __devinitdata = { .label = "da9052-gpio", .owner = THIS_MODULE, .get = da9052_gpio_get, .set = da9052_gpio_set, .direction_input = da9052_gpio_direction_input, .direction_output = da9052_gpio_direction_output, .to_irq = da9052_gpio_to_irq, .can_sleep = 1, .ngpio = 16, .base = -1, }; static int __devinit da9052_gpio_probe(struct platform_device *pdev) { struct da9052_gpio *gpio; struct da9052_pdata *pdata; int ret; gpio = kzalloc(sizeof(*gpio), GFP_KERNEL); if (gpio == NULL) return -ENOMEM; gpio->da9052 = dev_get_drvdata(pdev->dev.parent); pdata = gpio->da9052->dev->platform_data; gpio->gp = reference_gp; if (pdata && pdata->gpio_base) gpio->gp.base = pdata->gpio_base; ret = gpiochip_add(&gpio->gp); if (ret < 0) { dev_err(&pdev->dev, "Could not register gpiochip, %d\n", ret); goto err_mem; } platform_set_drvdata(pdev, gpio); return 0; err_mem: kfree(gpio); return ret; } static int __devexit da9052_gpio_remove(struct platform_device *pdev) { struct da9052_gpio *gpio = platform_get_drvdata(pdev); int ret; ret = gpiochip_remove(&gpio->gp); if (ret == 0) kfree(gpio); return ret; } static struct platform_driver da9052_gpio_driver = { .probe = da9052_gpio_probe, .remove = __devexit_p(da9052_gpio_remove), .driver = { .name = "da9052-gpio", .owner = THIS_MODULE, }, }; module_platform_driver(da9052_gpio_driver); MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>"); MODULE_DESCRIPTION("DA9052 GPIO Device Driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:da9052-gpio");