Commit fe2b0cda authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-4.21/libata-20181221' of git://git.kernel.dk/linux-block

Pull libata updates from Jens Axboe:
 "Here are the libata changes for this merge window. Nothing major in
  here. This contains:

   - GPIO descriptor conversions (Linus Walleij)

   - rcar deferred probing fix (Sergei Shtylyov)"

* tag 'for-4.21/libata-20181221' of git://git.kernel.dk/linux-block:
  sata_rcar: fix deferred probing
  ata: palmld: Introduce state container
  ata: palmld: Convert to GPIO descriptors
  ata: rb532_cf: Convert to use GPIO descriptors
  ata: sata_highbank: Convert to use GPIO descriptors
  ata: pxa: Drop <linux/gpio.h> include
parents 956eb6cb 9f83cfdb
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#ifndef __INCLUDE_MACH_PALM27X__ #ifndef __INCLUDE_MACH_PALM27X__
#define __INCLUDE_MACH_PALM27X__ #define __INCLUDE_MACH_PALM27X__
#include <linux/gpio/machine.h>
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
extern void __init palm27x_mmc_init(int detect, int ro, int power, extern void __init palm27x_mmc_init(int detect, int ro, int power,
int power_inverted); int power_inverted);
......
...@@ -288,8 +288,20 @@ static struct platform_device palmld_ide_device = { ...@@ -288,8 +288,20 @@ static struct platform_device palmld_ide_device = {
.id = -1, .id = -1,
}; };
static struct gpiod_lookup_table palmld_ide_gpio_table = {
.dev_id = "pata_palmld",
.table = {
GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_IDE_PWEN,
"power", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_IDE_RESET,
"reset", GPIO_ACTIVE_LOW),
{ },
},
};
static void __init palmld_ide_init(void) static void __init palmld_ide_init(void)
{ {
gpiod_add_lookup_table(&palmld_ide_gpio_table);
platform_device_register(&palmld_ide_device); platform_device_register(&palmld_ide_device);
} }
#else #else
......
...@@ -71,12 +71,6 @@ struct korina_device { ...@@ -71,12 +71,6 @@ struct korina_device {
struct net_device *dev; struct net_device *dev;
}; };
struct cf_device {
int gpio_pin;
void *dev;
struct gendisk *gd;
};
struct mpmc_device { struct mpmc_device {
unsigned char state; unsigned char state;
spinlock_t lock; spinlock_t lock;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/mtd/platnand.h> #include <linux/mtd/platnand.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio/machine.h>
#include <linux/gpio_keys.h> #include <linux/gpio_keys.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/serial_8250.h> #include <linux/serial_8250.h>
...@@ -127,14 +128,18 @@ static struct resource cf_slot0_res[] = { ...@@ -127,14 +128,18 @@ static struct resource cf_slot0_res[] = {
} }
}; };
static struct cf_device cf_slot0_data = { static struct gpiod_lookup_table cf_slot0_gpio_table = {
.gpio_pin = CF_GPIO_NUM .dev_id = "pata-rb532-cf",
.table = {
GPIO_LOOKUP("gpio0", CF_GPIO_NUM,
NULL, GPIO_ACTIVE_HIGH),
{ },
},
}; };
static struct platform_device cf_slot0 = { static struct platform_device cf_slot0 = {
.id = -1, .id = -1,
.name = "pata-rb532-cf", .name = "pata-rb532-cf",
.dev.platform_data = &cf_slot0_data,
.resource = cf_slot0_res, .resource = cf_slot0_res,
.num_resources = ARRAY_SIZE(cf_slot0_res), .num_resources = ARRAY_SIZE(cf_slot0_res),
}; };
...@@ -305,6 +310,7 @@ static int __init plat_setup_devices(void) ...@@ -305,6 +310,7 @@ static int __init plat_setup_devices(void)
dev_set_drvdata(&korina_dev0.dev, &korina_dev0_data); dev_set_drvdata(&korina_dev0.dev, &korina_dev0_data);
gpiod_add_lookup_table(&cf_slot0_gpio_table);
return platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs)); return platform_add_devices(rb532_devs, ARRAY_SIZE(rb532_devs));
} }
......
...@@ -26,16 +26,17 @@ ...@@ -26,16 +26,17 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/gpio.h> #include <linux/gpio/consumer.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
#include <mach/palmld.h> #include <mach/palmld.h>
#define DRV_NAME "pata_palmld" #define DRV_NAME "pata_palmld"
static struct gpio palmld_hdd_gpios[] = { struct palmld_pata {
{ GPIO_NR_PALMLD_IDE_PWEN, GPIOF_INIT_HIGH, "HDD Power" }, struct ata_host *host;
{ GPIO_NR_PALMLD_IDE_RESET, GPIOF_INIT_LOW, "HDD Reset" }, struct gpio_desc *power;
struct gpio_desc *reset;
}; };
static struct scsi_host_template palmld_sht = { static struct scsi_host_template palmld_sht = {
...@@ -50,39 +51,44 @@ static struct ata_port_operations palmld_port_ops = { ...@@ -50,39 +51,44 @@ static struct ata_port_operations palmld_port_ops = {
static int palmld_pata_probe(struct platform_device *pdev) static int palmld_pata_probe(struct platform_device *pdev)
{ {
struct ata_host *host; struct palmld_pata *lda;
struct ata_port *ap; struct ata_port *ap;
void __iomem *mem; void __iomem *mem;
struct device *dev = &pdev->dev;
int ret; int ret;
lda = devm_kzalloc(dev, sizeof(*lda), GFP_KERNEL);
if (!lda)
return -ENOMEM;
/* allocate host */ /* allocate host */
host = ata_host_alloc(&pdev->dev, 1); lda->host = ata_host_alloc(dev, 1);
if (!host) { if (!lda->host)
ret = -ENOMEM; return -ENOMEM;
goto err1;
}
/* remap drive's physical memory address */ /* remap drive's physical memory address */
mem = devm_ioremap(&pdev->dev, PALMLD_IDE_PHYS, 0x1000); mem = devm_ioremap(dev, PALMLD_IDE_PHYS, 0x1000);
if (!mem) { if (!mem)
ret = -ENOMEM; return -ENOMEM;
goto err1;
/* request and activate power and reset GPIOs */
lda->power = devm_gpiod_get(dev, "power", GPIOD_OUT_HIGH);
if (IS_ERR(lda->power))
return PTR_ERR(lda->power);
lda->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(lda->reset)) {
gpiod_set_value(lda->power, 0);
return PTR_ERR(lda->reset);
} }
/* request and activate power GPIO, IRQ GPIO */ /* Assert reset to reset the drive */
ret = gpio_request_array(palmld_hdd_gpios, gpiod_set_value(lda->reset, 1);
ARRAY_SIZE(palmld_hdd_gpios));
if (ret)
goto err1;
/* reset the drive */
gpio_set_value(GPIO_NR_PALMLD_IDE_RESET, 0);
msleep(30); msleep(30);
gpio_set_value(GPIO_NR_PALMLD_IDE_RESET, 1); gpiod_set_value(lda->reset, 0);
msleep(30); msleep(30);
/* setup the ata port */ /* setup the ata port */
ap = host->ports[0]; ap = lda->host->ports[0];
ap->ops = &palmld_port_ops; ap->ops = &palmld_port_ops;
ap->pio_mask = ATA_PIO4; ap->pio_mask = ATA_PIO4;
ap->flags |= ATA_FLAG_PIO_POLLING; ap->flags |= ATA_FLAG_PIO_POLLING;
...@@ -96,27 +102,26 @@ static int palmld_pata_probe(struct platform_device *pdev) ...@@ -96,27 +102,26 @@ static int palmld_pata_probe(struct platform_device *pdev)
ata_sff_std_ports(&ap->ioaddr); ata_sff_std_ports(&ap->ioaddr);
/* activate host */ /* activate host */
ret = ata_host_activate(host, 0, NULL, IRQF_TRIGGER_RISING, ret = ata_host_activate(lda->host, 0, NULL, IRQF_TRIGGER_RISING,
&palmld_sht); &palmld_sht);
if (ret) /* power down on failure */
goto err2; if (ret) {
gpiod_set_value(lda->power, 0);
return ret; return ret;
}
err2: platform_set_drvdata(pdev, lda);
gpio_free_array(palmld_hdd_gpios, ARRAY_SIZE(palmld_hdd_gpios)); return 0;
err1:
return ret;
} }
static int palmld_pata_remove(struct platform_device *dev) static int palmld_pata_remove(struct platform_device *pdev)
{ {
ata_platform_remove_one(dev); struct palmld_pata *lda = platform_get_drvdata(pdev);
/* power down the HDD */ ata_platform_remove_one(pdev);
gpio_set_value(GPIO_NR_PALMLD_IDE_PWEN, 0);
gpio_free_array(palmld_hdd_gpios, ARRAY_SIZE(palmld_hdd_gpios)); /* power down the HDD */
gpiod_set_value(lda->power, 0);
return 0; return 0;
} }
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
#include <linux/libata.h> #include <linux/libata.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/gpio.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/completion.h> #include <linux/completion.h>
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/gpio.h> #include <linux/gpio/consumer.h>
#include <linux/libata.h> #include <linux/libata.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
struct rb532_cf_info { struct rb532_cf_info {
void __iomem *iobase; void __iomem *iobase;
unsigned int gpio_line; struct gpio_desc *gpio_line;
unsigned int irq; unsigned int irq;
}; };
...@@ -60,7 +60,7 @@ static irqreturn_t rb532_pata_irq_handler(int irq, void *dev_instance) ...@@ -60,7 +60,7 @@ static irqreturn_t rb532_pata_irq_handler(int irq, void *dev_instance)
struct ata_host *ah = dev_instance; struct ata_host *ah = dev_instance;
struct rb532_cf_info *info = ah->private_data; struct rb532_cf_info *info = ah->private_data;
if (gpio_get_value(info->gpio_line)) { if (gpiod_get_value(info->gpio_line)) {
irq_set_irq_type(info->irq, IRQ_TYPE_LEVEL_LOW); irq_set_irq_type(info->irq, IRQ_TYPE_LEVEL_LOW);
ata_sff_interrupt(info->irq, dev_instance); ata_sff_interrupt(info->irq, dev_instance);
} else { } else {
...@@ -106,10 +106,9 @@ static void rb532_pata_setup_ports(struct ata_host *ah) ...@@ -106,10 +106,9 @@ static void rb532_pata_setup_ports(struct ata_host *ah)
static int rb532_pata_driver_probe(struct platform_device *pdev) static int rb532_pata_driver_probe(struct platform_device *pdev)
{ {
int irq; int irq;
int gpio; struct gpio_desc *gpiod;
struct resource *res; struct resource *res;
struct ata_host *ah; struct ata_host *ah;
struct cf_device *pdata;
struct rb532_cf_info *info; struct rb532_cf_info *info;
int ret; int ret;
...@@ -125,23 +124,12 @@ static int rb532_pata_driver_probe(struct platform_device *pdev) ...@@ -125,23 +124,12 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
return -ENOENT; return -ENOENT;
} }
pdata = dev_get_platdata(&pdev->dev); gpiod = devm_gpiod_get(&pdev->dev, NULL, GPIOD_IN);
if (!pdata) { if (IS_ERR(gpiod)) {
dev_err(&pdev->dev, "no platform data specified\n");
return -EINVAL;
}
gpio = pdata->gpio_pin;
if (gpio < 0) {
dev_err(&pdev->dev, "no GPIO found for irq%d\n", irq); dev_err(&pdev->dev, "no GPIO found for irq%d\n", irq);
return -ENOENT; return PTR_ERR(gpiod);
}
ret = gpio_request(gpio, DRV_NAME);
if (ret) {
dev_err(&pdev->dev, "GPIO request failed\n");
return ret;
} }
gpiod_set_consumer_name(gpiod, DRV_NAME);
/* allocate host */ /* allocate host */
ah = ata_host_alloc(&pdev->dev, RB500_CF_MAXPORTS); ah = ata_host_alloc(&pdev->dev, RB500_CF_MAXPORTS);
...@@ -153,7 +141,7 @@ static int rb532_pata_driver_probe(struct platform_device *pdev) ...@@ -153,7 +141,7 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
return -ENOMEM; return -ENOMEM;
ah->private_data = info; ah->private_data = info;
info->gpio_line = gpio; info->gpio_line = gpiod;
info->irq = irq; info->irq = irq;
info->iobase = devm_ioremap_nocache(&pdev->dev, res->start, info->iobase = devm_ioremap_nocache(&pdev->dev, res->start,
...@@ -161,26 +149,14 @@ static int rb532_pata_driver_probe(struct platform_device *pdev) ...@@ -161,26 +149,14 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
if (!info->iobase) if (!info->iobase)
return -ENOMEM; return -ENOMEM;
ret = gpio_direction_input(gpio);
if (ret) {
dev_err(&pdev->dev, "unable to set GPIO direction, err=%d\n",
ret);
goto err_free_gpio;
}
rb532_pata_setup_ports(ah); rb532_pata_setup_ports(ah);
ret = ata_host_activate(ah, irq, rb532_pata_irq_handler, ret = ata_host_activate(ah, irq, rb532_pata_irq_handler,
IRQF_TRIGGER_LOW, &rb532_pata_sht); IRQF_TRIGGER_LOW, &rb532_pata_sht);
if (ret) if (ret)
goto err_free_gpio; return ret;
return 0; return 0;
err_free_gpio:
gpio_free(gpio);
return ret;
} }
static int rb532_pata_driver_remove(struct platform_device *pdev) static int rb532_pata_driver_remove(struct platform_device *pdev)
...@@ -189,7 +165,6 @@ static int rb532_pata_driver_remove(struct platform_device *pdev) ...@@ -189,7 +165,6 @@ static int rb532_pata_driver_remove(struct platform_device *pdev)
struct rb532_cf_info *info = ah->private_data; struct rb532_cf_info *info = ah->private_data;
ata_host_detach(ah); ata_host_detach(ah);
gpio_free(info->gpio_line);
return 0; return 0;
} }
......
...@@ -31,8 +31,7 @@ ...@@ -31,8 +31,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/gpio.h> #include <linux/gpio/consumer.h>
#include <linux/of_gpio.h>
#include "ahci.h" #include "ahci.h"
...@@ -85,7 +84,7 @@ struct ecx_plat_data { ...@@ -85,7 +84,7 @@ struct ecx_plat_data {
/* number of extra clocks that the SGPIO PIC controller expects */ /* number of extra clocks that the SGPIO PIC controller expects */
u32 pre_clocks; u32 pre_clocks;
u32 post_clocks; u32 post_clocks;
unsigned sgpio_gpio[SGPIO_PINS]; struct gpio_desc *sgpio_gpiod[SGPIO_PINS];
u32 sgpio_pattern; u32 sgpio_pattern;
u32 port_to_sgpio[SGPIO_PORTS]; u32 port_to_sgpio[SGPIO_PORTS];
}; };
...@@ -131,9 +130,9 @@ static void ecx_parse_sgpio(struct ecx_plat_data *pdata, u32 port, u32 state) ...@@ -131,9 +130,9 @@ static void ecx_parse_sgpio(struct ecx_plat_data *pdata, u32 port, u32 state)
*/ */
static void ecx_led_cycle_clock(struct ecx_plat_data *pdata) static void ecx_led_cycle_clock(struct ecx_plat_data *pdata)
{ {
gpio_set_value(pdata->sgpio_gpio[SCLOCK], 1); gpiod_set_value(pdata->sgpio_gpiod[SCLOCK], 1);
udelay(50); udelay(50);
gpio_set_value(pdata->sgpio_gpio[SCLOCK], 0); gpiod_set_value(pdata->sgpio_gpiod[SCLOCK], 0);
udelay(50); udelay(50);
} }
...@@ -164,15 +163,15 @@ static ssize_t ecx_transmit_led_message(struct ata_port *ap, u32 state, ...@@ -164,15 +163,15 @@ static ssize_t ecx_transmit_led_message(struct ata_port *ap, u32 state,
for (i = 0; i < pdata->pre_clocks; i++) for (i = 0; i < pdata->pre_clocks; i++)
ecx_led_cycle_clock(pdata); ecx_led_cycle_clock(pdata);
gpio_set_value(pdata->sgpio_gpio[SLOAD], 1); gpiod_set_value(pdata->sgpio_gpiod[SLOAD], 1);
ecx_led_cycle_clock(pdata); ecx_led_cycle_clock(pdata);
gpio_set_value(pdata->sgpio_gpio[SLOAD], 0); gpiod_set_value(pdata->sgpio_gpiod[SLOAD], 0);
/* /*
* bit-bang out the SGPIO pattern, by consuming a bit and then * bit-bang out the SGPIO pattern, by consuming a bit and then
* clocking it out. * clocking it out.
*/ */
for (i = 0; i < (SGPIO_SIGNALS * pdata->n_ports); i++) { for (i = 0; i < (SGPIO_SIGNALS * pdata->n_ports); i++) {
gpio_set_value(pdata->sgpio_gpio[SDATA], sgpio_out & 1); gpiod_set_value(pdata->sgpio_gpiod[SDATA], sgpio_out & 1);
sgpio_out >>= 1; sgpio_out >>= 1;
ecx_led_cycle_clock(pdata); ecx_led_cycle_clock(pdata);
} }
...@@ -193,21 +192,19 @@ static void highbank_set_em_messages(struct device *dev, ...@@ -193,21 +192,19 @@ static void highbank_set_em_messages(struct device *dev,
struct device_node *np = dev->of_node; struct device_node *np = dev->of_node;
struct ecx_plat_data *pdata = hpriv->plat_data; struct ecx_plat_data *pdata = hpriv->plat_data;
int i; int i;
int err;
for (i = 0; i < SGPIO_PINS; i++) { for (i = 0; i < SGPIO_PINS; i++) {
err = of_get_named_gpio(np, "calxeda,sgpio-gpio", i); struct gpio_desc *gpiod;
if (err < 0)
return; gpiod = devm_gpiod_get_index(dev, "calxeda,sgpio", i,
GPIOD_OUT_HIGH);
pdata->sgpio_gpio[i] = err; if (IS_ERR(gpiod)) {
err = gpio_request(pdata->sgpio_gpio[i], "CX SGPIO"); dev_err(dev, "failed to get GPIO %d\n", i);
if (err) { continue;
pr_err("sata_highbank gpio_request %d failed: %d\n",
i, err);
return;
} }
gpio_direction_output(pdata->sgpio_gpio[i], 1); gpiod_set_consumer_name(gpiod, "CX SGPIO");
pdata->sgpio_gpiod[i] = gpiod;
} }
of_property_read_u32_array(np, "calxeda,led-order", of_property_read_u32_array(np, "calxeda,led-order",
pdata->port_to_sgpio, pdata->port_to_sgpio,
......
...@@ -891,7 +891,9 @@ static int sata_rcar_probe(struct platform_device *pdev) ...@@ -891,7 +891,9 @@ static int sata_rcar_probe(struct platform_device *pdev)
int ret = 0; int ret = 0;
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (irq <= 0) if (irq < 0)
return irq;
if (!irq)
return -EINVAL; return -EINVAL;
priv = devm_kzalloc(dev, sizeof(struct sata_rcar_priv), GFP_KERNEL); priv = devm_kzalloc(dev, sizeof(struct sata_rcar_priv), GFP_KERNEL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment