mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 23:51:37 +00:00
for-4.21/libata-20181221
-----BEGIN PGP SIGNATURE----- iQJEBAABCAAuFiEEwPw5LcreJtl1+l5K99NY+ylx4KYFAlwb7YsQHGF4Ym9lQGtl cm5lbC5kawAKCRD301j7KXHgpoBAEAC79+xxdGMoXV6NQIDh4uM7fFaavRIpkDMP SCFY8BqFm4Y+zzpk8R+ze8kNB3Xzikir0X0Ejh3428dlSQkzJ/0EATzcdAFM4Sml GIY53IcYAS/2rqE8334q9beccg5jfoN99o/VDrt493fNYTprSxS2EiYuZGH0eEO7 LjqDhSNeWBt0rwqNBRcNmzRIAfPBfNVmBB38MxtUCJEIwK3ozLVJuufVnYQ+cLSb lbL3LO+QD9h2BWX/NunGvPdw+uQ+6Vq1qITHGIHrIdA63nQ94K1Q8HhTwx6z1y0u teZ2SdIsmjW4J6iKe6bwofioF/XLxD2g+LRIAVUF8UycTk7ySCIEF5axqIyA96Mg Ced4xRUaUvcQyjys7Z6j0SmOdSeBJozhcgRdmZtplO7vpAwlNGZW692hYbzaV7a2 US0V3BNlbgrIsJlc6WwhHTedRWgZl5NOxs1Mt73Hw8dS2yj9Avb5wPoh//ax40jl JEjD/T1LZhUqi1FxDYndhr+xK/nhAKYcW/XPDCTnd0bEqTZnYq8Mo4Z1BnNLdSIm U1Mgth53MLj5lIHAAseesoOEBBcwFl2um1CfuGgZrc/vm/CEiMLOkTKsoA1E7Ue9 s1XAH4WFNDvNsZI284EXY796a32+OTai+g+dissfPqwQEz0v0/T15OAdsmWBWu3G s50uh6/yyw== =+PqW -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
fe2b0cdabc
@ -12,6 +12,8 @@
|
||||
#ifndef __INCLUDE_MACH_PALM27X__
|
||||
#define __INCLUDE_MACH_PALM27X__
|
||||
|
||||
#include <linux/gpio/machine.h>
|
||||
|
||||
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
|
||||
extern void __init palm27x_mmc_init(int detect, int ro, int power,
|
||||
int power_inverted);
|
||||
|
@ -288,8 +288,20 @@ static struct platform_device palmld_ide_device = {
|
||||
.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)
|
||||
{
|
||||
gpiod_add_lookup_table(&palmld_ide_gpio_table);
|
||||
platform_device_register(&palmld_ide_device);
|
||||
}
|
||||
#else
|
||||
|
@ -71,12 +71,6 @@ struct korina_device {
|
||||
struct net_device *dev;
|
||||
};
|
||||
|
||||
struct cf_device {
|
||||
int gpio_pin;
|
||||
void *dev;
|
||||
struct gendisk *gd;
|
||||
};
|
||||
|
||||
struct mpmc_device {
|
||||
unsigned char state;
|
||||
spinlock_t lock;
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <linux/mtd/platnand.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/serial_8250.h>
|
||||
@ -127,14 +128,18 @@ static struct resource cf_slot0_res[] = {
|
||||
}
|
||||
};
|
||||
|
||||
static struct cf_device cf_slot0_data = {
|
||||
.gpio_pin = CF_GPIO_NUM
|
||||
static struct gpiod_lookup_table cf_slot0_gpio_table = {
|
||||
.dev_id = "pata-rb532-cf",
|
||||
.table = {
|
||||
GPIO_LOOKUP("gpio0", CF_GPIO_NUM,
|
||||
NULL, GPIO_ACTIVE_HIGH),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device cf_slot0 = {
|
||||
.id = -1,
|
||||
.name = "pata-rb532-cf",
|
||||
.dev.platform_data = &cf_slot0_data,
|
||||
.resource = cf_slot0_res,
|
||||
.num_resources = ARRAY_SIZE(cf_slot0_res),
|
||||
};
|
||||
@ -305,6 +310,7 @@ static int __init plat_setup_devices(void)
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -26,16 +26,17 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <mach/palmld.h>
|
||||
|
||||
#define DRV_NAME "pata_palmld"
|
||||
|
||||
static struct gpio palmld_hdd_gpios[] = {
|
||||
{ GPIO_NR_PALMLD_IDE_PWEN, GPIOF_INIT_HIGH, "HDD Power" },
|
||||
{ GPIO_NR_PALMLD_IDE_RESET, GPIOF_INIT_LOW, "HDD Reset" },
|
||||
struct palmld_pata {
|
||||
struct ata_host *host;
|
||||
struct gpio_desc *power;
|
||||
struct gpio_desc *reset;
|
||||
};
|
||||
|
||||
static struct scsi_host_template palmld_sht = {
|
||||
@ -50,39 +51,44 @@ static struct ata_port_operations palmld_port_ops = {
|
||||
|
||||
static int palmld_pata_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host;
|
||||
struct palmld_pata *lda;
|
||||
struct ata_port *ap;
|
||||
void __iomem *mem;
|
||||
struct device *dev = &pdev->dev;
|
||||
int ret;
|
||||
|
||||
lda = devm_kzalloc(dev, sizeof(*lda), GFP_KERNEL);
|
||||
if (!lda)
|
||||
return -ENOMEM;
|
||||
|
||||
/* allocate host */
|
||||
host = ata_host_alloc(&pdev->dev, 1);
|
||||
if (!host) {
|
||||
ret = -ENOMEM;
|
||||
goto err1;
|
||||
}
|
||||
lda->host = ata_host_alloc(dev, 1);
|
||||
if (!lda->host)
|
||||
return -ENOMEM;
|
||||
|
||||
/* remap drive's physical memory address */
|
||||
mem = devm_ioremap(&pdev->dev, PALMLD_IDE_PHYS, 0x1000);
|
||||
if (!mem) {
|
||||
ret = -ENOMEM;
|
||||
goto err1;
|
||||
mem = devm_ioremap(dev, PALMLD_IDE_PHYS, 0x1000);
|
||||
if (!mem)
|
||||
return -ENOMEM;
|
||||
|
||||
/* 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 */
|
||||
ret = gpio_request_array(palmld_hdd_gpios,
|
||||
ARRAY_SIZE(palmld_hdd_gpios));
|
||||
if (ret)
|
||||
goto err1;
|
||||
|
||||
/* reset the drive */
|
||||
gpio_set_value(GPIO_NR_PALMLD_IDE_RESET, 0);
|
||||
/* Assert reset to reset the drive */
|
||||
gpiod_set_value(lda->reset, 1);
|
||||
msleep(30);
|
||||
gpio_set_value(GPIO_NR_PALMLD_IDE_RESET, 1);
|
||||
gpiod_set_value(lda->reset, 0);
|
||||
msleep(30);
|
||||
|
||||
/* setup the ata port */
|
||||
ap = host->ports[0];
|
||||
ap = lda->host->ports[0];
|
||||
ap->ops = &palmld_port_ops;
|
||||
ap->pio_mask = ATA_PIO4;
|
||||
ap->flags |= ATA_FLAG_PIO_POLLING;
|
||||
@ -96,27 +102,26 @@ static int palmld_pata_probe(struct platform_device *pdev)
|
||||
ata_sff_std_ports(&ap->ioaddr);
|
||||
|
||||
/* activate host */
|
||||
ret = ata_host_activate(host, 0, NULL, IRQF_TRIGGER_RISING,
|
||||
&palmld_sht);
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = ata_host_activate(lda->host, 0, NULL, IRQF_TRIGGER_RISING,
|
||||
&palmld_sht);
|
||||
/* power down on failure */
|
||||
if (ret) {
|
||||
gpiod_set_value(lda->power, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
err2:
|
||||
gpio_free_array(palmld_hdd_gpios, ARRAY_SIZE(palmld_hdd_gpios));
|
||||
err1:
|
||||
return ret;
|
||||
platform_set_drvdata(pdev, lda);
|
||||
return 0;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
ata_platform_remove_one(pdev);
|
||||
|
||||
/* power down the HDD */
|
||||
gpio_set_value(GPIO_NR_PALMLD_IDE_PWEN, 0);
|
||||
|
||||
gpio_free_array(palmld_hdd_gpios, ARRAY_SIZE(palmld_hdd_gpios));
|
||||
gpiod_set_value(lda->power, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <linux/libata.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/completion.h>
|
||||
|
||||
|
@ -27,7 +27,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
#include <linux/libata.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
@ -49,7 +49,7 @@
|
||||
|
||||
struct rb532_cf_info {
|
||||
void __iomem *iobase;
|
||||
unsigned int gpio_line;
|
||||
struct gpio_desc *gpio_line;
|
||||
unsigned int irq;
|
||||
};
|
||||
|
||||
@ -60,7 +60,7 @@ static irqreturn_t rb532_pata_irq_handler(int irq, void *dev_instance)
|
||||
struct ata_host *ah = dev_instance;
|
||||
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);
|
||||
ata_sff_interrupt(info->irq, dev_instance);
|
||||
} else {
|
||||
@ -106,10 +106,9 @@ static void rb532_pata_setup_ports(struct ata_host *ah)
|
||||
static int rb532_pata_driver_probe(struct platform_device *pdev)
|
||||
{
|
||||
int irq;
|
||||
int gpio;
|
||||
struct gpio_desc *gpiod;
|
||||
struct resource *res;
|
||||
struct ata_host *ah;
|
||||
struct cf_device *pdata;
|
||||
struct rb532_cf_info *info;
|
||||
int ret;
|
||||
|
||||
@ -125,23 +124,12 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
pdata = dev_get_platdata(&pdev->dev);
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "no platform data specified\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
gpio = pdata->gpio_pin;
|
||||
if (gpio < 0) {
|
||||
gpiod = devm_gpiod_get(&pdev->dev, NULL, GPIOD_IN);
|
||||
if (IS_ERR(gpiod)) {
|
||||
dev_err(&pdev->dev, "no GPIO found for irq%d\n", irq);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
ret = gpio_request(gpio, DRV_NAME);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "GPIO request failed\n");
|
||||
return ret;
|
||||
return PTR_ERR(gpiod);
|
||||
}
|
||||
gpiod_set_consumer_name(gpiod, DRV_NAME);
|
||||
|
||||
/* allocate host */
|
||||
ah = ata_host_alloc(&pdev->dev, RB500_CF_MAXPORTS);
|
||||
@ -153,7 +141,7 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
ah->private_data = info;
|
||||
info->gpio_line = gpio;
|
||||
info->gpio_line = gpiod;
|
||||
info->irq = irq;
|
||||
|
||||
info->iobase = devm_ioremap_nocache(&pdev->dev, res->start,
|
||||
@ -161,26 +149,14 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
|
||||
if (!info->iobase)
|
||||
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);
|
||||
|
||||
ret = ata_host_activate(ah, irq, rb532_pata_irq_handler,
|
||||
IRQF_TRIGGER_LOW, &rb532_pata_sht);
|
||||
if (ret)
|
||||
goto err_free_gpio;
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_gpio:
|
||||
gpio_free(gpio);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
ata_host_detach(ah);
|
||||
gpio_free(info->gpio_line);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -31,8 +31,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
#include "ahci.h"
|
||||
|
||||
@ -85,7 +84,7 @@ struct ecx_plat_data {
|
||||
/* number of extra clocks that the SGPIO PIC controller expects */
|
||||
u32 pre_clocks;
|
||||
u32 post_clocks;
|
||||
unsigned sgpio_gpio[SGPIO_PINS];
|
||||
struct gpio_desc *sgpio_gpiod[SGPIO_PINS];
|
||||
u32 sgpio_pattern;
|
||||
u32 port_to_sgpio[SGPIO_PORTS];
|
||||
};
|
||||
@ -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)
|
||||
{
|
||||
gpio_set_value(pdata->sgpio_gpio[SCLOCK], 1);
|
||||
gpiod_set_value(pdata->sgpio_gpiod[SCLOCK], 1);
|
||||
udelay(50);
|
||||
gpio_set_value(pdata->sgpio_gpio[SCLOCK], 0);
|
||||
gpiod_set_value(pdata->sgpio_gpiod[SCLOCK], 0);
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
@ -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++)
|
||||
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);
|
||||
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
|
||||
* clocking it out.
|
||||
*/
|
||||
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;
|
||||
ecx_led_cycle_clock(pdata);
|
||||
}
|
||||
@ -193,21 +192,19 @@ static void highbank_set_em_messages(struct device *dev,
|
||||
struct device_node *np = dev->of_node;
|
||||
struct ecx_plat_data *pdata = hpriv->plat_data;
|
||||
int i;
|
||||
int err;
|
||||
|
||||
for (i = 0; i < SGPIO_PINS; i++) {
|
||||
err = of_get_named_gpio(np, "calxeda,sgpio-gpio", i);
|
||||
if (err < 0)
|
||||
return;
|
||||
struct gpio_desc *gpiod;
|
||||
|
||||
pdata->sgpio_gpio[i] = err;
|
||||
err = gpio_request(pdata->sgpio_gpio[i], "CX SGPIO");
|
||||
if (err) {
|
||||
pr_err("sata_highbank gpio_request %d failed: %d\n",
|
||||
i, err);
|
||||
return;
|
||||
gpiod = devm_gpiod_get_index(dev, "calxeda,sgpio", i,
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(gpiod)) {
|
||||
dev_err(dev, "failed to get GPIO %d\n", i);
|
||||
continue;
|
||||
}
|
||||
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",
|
||||
pdata->port_to_sgpio,
|
||||
|
@ -891,7 +891,9 @@ static int sata_rcar_probe(struct platform_device *pdev)
|
||||
int ret = 0;
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq <= 0)
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
if (!irq)
|
||||
return -EINVAL;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(struct sata_rcar_priv), GFP_KERNEL);
|
||||
|
Loading…
Reference in New Issue
Block a user