Commit 70a3550b authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'spi/topic/atmel', 'spi/topic/bcm-qspi',...

Merge remote-tracking branches 'spi/topic/atmel', 'spi/topic/bcm-qspi', 'spi/topic/bcm2835aux', 'spi/topic/dw' and 'spi/topic/gpio' into spi-next
SPI-GPIO devicetree bindings SPI-GPIO devicetree bindings
This represents a group of 3-n GPIO lines used for bit-banged SPI on dedicated
GPIO lines.
Required properties: Required properties:
- compatible: should be set to "spi-gpio" - compatible: should be set to "spi-gpio"
- #address-cells: should be set to <0x1> - #address-cells: should be set to <0x1>
- ranges - ranges
- gpio-sck: GPIO spec for the SCK line to use - sck-gpios: GPIO spec for the SCK line to use
- gpio-miso: GPIO spec for the MISO line to use - miso-gpios: GPIO spec for the MISO line to use
- gpio-mosi: GPIO spec for the MOSI line to use - mosi-gpios: GPIO spec for the MOSI line to use
- cs-gpios: GPIOs to use for chipselect lines. - cs-gpios: GPIOs to use for chipselect lines.
Not needed if num-chipselects = <0>. Not needed if num-chipselects = <0>.
- num-chipselects: Number of chipselect lines. Should be <0> if a single device - num-chipselects: Number of chipselect lines. Should be <0> if a single device
with no chip select is connected. with no chip select is connected.
Deprecated bindings:
These legacy GPIO line bindings can alternatively be used to define the
GPIO lines used, they should not be used in new device trees.
- gpio-sck: GPIO spec for the SCK line to use
- gpio-miso: GPIO spec for the MISO line to use
- gpio-mosi: GPIO spec for the MOSI line to use
Example: Example:
spi { spi {
...@@ -20,9 +32,9 @@ Example: ...@@ -20,9 +32,9 @@ Example:
#address-cells = <0x1>; #address-cells = <0x1>;
ranges; ranges;
gpio-sck = <&gpio 95 0>; sck-gpios = <&gpio 95 0>;
gpio-miso = <&gpio 98 0>; miso-gpios = <&gpio 98 0>;
gpio-mosi = <&gpio 97 0>; mosi-gpios = <&gpio 97 0>;
cs-gpios = <&gpio 125 0>; cs-gpios = <&gpio 125 0>;
num-chipselects = <1>; num-chipselects = <1>;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio/machine.h>
#include <linux/dm9000.h> #include <linux/dm9000.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/platform_data/rtc-v3020.h> #include <linux/platform_data/rtc-v3020.h>
...@@ -343,9 +344,6 @@ static inline void cm_x300_init_bl(void) {} ...@@ -343,9 +344,6 @@ static inline void cm_x300_init_bl(void) {}
#define LCD_SPI_BUS_NUM (1) #define LCD_SPI_BUS_NUM (1)
static struct spi_gpio_platform_data cm_x300_spi_gpio_pdata = { static struct spi_gpio_platform_data cm_x300_spi_gpio_pdata = {
.sck = GPIO_LCD_SCL,
.mosi = GPIO_LCD_DIN,
.miso = GPIO_LCD_DOUT,
.num_chipselect = 1, .num_chipselect = 1,
}; };
...@@ -357,6 +355,21 @@ static struct platform_device cm_x300_spi_gpio = { ...@@ -357,6 +355,21 @@ static struct platform_device cm_x300_spi_gpio = {
}, },
}; };
static struct gpiod_lookup_table cm_x300_spi_gpiod_table = {
.dev_id = "spi_gpio",
.table = {
GPIO_LOOKUP("gpio-pxa", GPIO_LCD_SCL,
"sck", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio-pxa", GPIO_LCD_DIN,
"mosi", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio-pxa", GPIO_LCD_DOUT,
"miso", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio-pxa", GPIO_LCD_CS,
"cs", GPIO_ACTIVE_HIGH),
{ },
},
};
static struct tdo24m_platform_data cm_x300_tdo24m_pdata = { static struct tdo24m_platform_data cm_x300_tdo24m_pdata = {
.model = TDO35S, .model = TDO35S,
}; };
...@@ -367,7 +380,6 @@ static struct spi_board_info cm_x300_spi_devices[] __initdata = { ...@@ -367,7 +380,6 @@ static struct spi_board_info cm_x300_spi_devices[] __initdata = {
.max_speed_hz = 1000000, .max_speed_hz = 1000000,
.bus_num = LCD_SPI_BUS_NUM, .bus_num = LCD_SPI_BUS_NUM,
.chip_select = 0, .chip_select = 0,
.controller_data = (void *) GPIO_LCD_CS,
.platform_data = &cm_x300_tdo24m_pdata, .platform_data = &cm_x300_tdo24m_pdata,
}, },
}; };
...@@ -376,6 +388,7 @@ static void __init cm_x300_init_spi(void) ...@@ -376,6 +388,7 @@ static void __init cm_x300_init_spi(void)
{ {
spi_register_board_info(cm_x300_spi_devices, spi_register_board_info(cm_x300_spi_devices,
ARRAY_SIZE(cm_x300_spi_devices)); ARRAY_SIZE(cm_x300_spi_devices));
gpiod_add_lookup_table(&cm_x300_spi_gpiod_table);
platform_device_register(&cm_x300_spi_gpio); platform_device_register(&cm_x300_spi_gpio);
} }
#else #else
......
...@@ -646,9 +646,6 @@ static void __init raumfeld_lcd_init(void) ...@@ -646,9 +646,6 @@ static void __init raumfeld_lcd_init(void)
*/ */
static struct spi_gpio_platform_data raumfeld_spi_platform_data = { static struct spi_gpio_platform_data raumfeld_spi_platform_data = {
.sck = GPIO_SPI_CLK,
.mosi = GPIO_SPI_MOSI,
.miso = GPIO_SPI_MISO,
.num_chipselect = 3, .num_chipselect = 3,
}; };
...@@ -660,6 +657,25 @@ static struct platform_device raumfeld_spi_device = { ...@@ -660,6 +657,25 @@ static struct platform_device raumfeld_spi_device = {
} }
}; };
static struct gpiod_lookup_table raumfeld_spi_gpiod_table = {
.dev_id = "spi_gpio",
.table = {
GPIO_LOOKUP("gpio-0", GPIO_SPI_CLK,
"sck", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio-0", GPIO_SPI_MOSI,
"mosi", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio-0", GPIO_SPI_MISO,
"miso", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP_IDX("gpio-0", GPIO_SPDIF_CS,
"cs", 0, GPIO_ACTIVE_HIGH),
GPIO_LOOKUP_IDX("gpio-0", GPIO_ACCEL_CS,
"cs", 1, GPIO_ACTIVE_HIGH),
GPIO_LOOKUP_IDX("gpio-0", GPIO_MCLK_DAC_CS,
"cs", 2, GPIO_ACTIVE_HIGH),
{ },
},
};
static struct lis3lv02d_platform_data lis3_pdata = { static struct lis3lv02d_platform_data lis3_pdata = {
.click_flags = LIS3_CLICK_SINGLE_X | .click_flags = LIS3_CLICK_SINGLE_X |
LIS3_CLICK_SINGLE_Y | LIS3_CLICK_SINGLE_Y |
...@@ -680,7 +696,6 @@ static struct lis3lv02d_platform_data lis3_pdata = { ...@@ -680,7 +696,6 @@ static struct lis3lv02d_platform_data lis3_pdata = {
.max_speed_hz = 10000, \ .max_speed_hz = 10000, \
.bus_num = 0, \ .bus_num = 0, \
.chip_select = 0, \ .chip_select = 0, \
.controller_data = (void *) GPIO_SPDIF_CS, \
} }
#define SPI_LIS3 \ #define SPI_LIS3 \
...@@ -689,7 +704,6 @@ static struct lis3lv02d_platform_data lis3_pdata = { ...@@ -689,7 +704,6 @@ static struct lis3lv02d_platform_data lis3_pdata = {
.max_speed_hz = 1000000, \ .max_speed_hz = 1000000, \
.bus_num = 0, \ .bus_num = 0, \
.chip_select = 1, \ .chip_select = 1, \
.controller_data = (void *) GPIO_ACCEL_CS, \
.platform_data = &lis3_pdata, \ .platform_data = &lis3_pdata, \
.irq = PXA_GPIO_TO_IRQ(GPIO_ACCEL_IRQ), \ .irq = PXA_GPIO_TO_IRQ(GPIO_ACCEL_IRQ), \
} }
...@@ -700,7 +714,6 @@ static struct lis3lv02d_platform_data lis3_pdata = { ...@@ -700,7 +714,6 @@ static struct lis3lv02d_platform_data lis3_pdata = {
.max_speed_hz = 1000000, \ .max_speed_hz = 1000000, \
.bus_num = 0, \ .bus_num = 0, \
.chip_select = 2, \ .chip_select = 2, \
.controller_data = (void *) GPIO_MCLK_DAC_CS, \
} }
static struct spi_board_info connector_spi_devices[] __initdata = { static struct spi_board_info connector_spi_devices[] __initdata = {
...@@ -1066,6 +1079,7 @@ static void __init raumfeld_common_init(void) ...@@ -1066,6 +1079,7 @@ static void __init raumfeld_common_init(void)
else else
gpio_direction_output(GPIO_SHUTDOWN_SUPPLY, 0); gpio_direction_output(GPIO_SHUTDOWN_SUPPLY, 0);
gpiod_add_lookup_table(&raumfeld_spi_gpiod_table);
platform_add_devices(ARRAY_AND_SIZE(raumfeld_common_devices)); platform_add_devices(ARRAY_AND_SIZE(raumfeld_common_devices));
i2c_register_board_info(1, &raumfeld_pwri2c_board_info, 1); i2c_register_board_info(1, &raumfeld_pwri2c_board_info, 1);
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio/machine.h>
#include <linux/syscore_ops.h> #include <linux/syscore_ops.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/serial_s3c.h> #include <linux/serial_s3c.h>
...@@ -388,32 +389,53 @@ static struct ili9320_platdata jive_lcm_config = { ...@@ -388,32 +389,53 @@ static struct ili9320_platdata jive_lcm_config = {
/* LCD SPI support */ /* LCD SPI support */
static struct spi_gpio_platform_data jive_lcd_spi = { static struct spi_gpio_platform_data jive_lcd_spi = {
.sck = S3C2410_GPG(8), .num_chipselect = 1,
.mosi = S3C2410_GPB(8),
.miso = SPI_GPIO_NO_MISO,
}; };
static struct platform_device jive_device_lcdspi = { static struct platform_device jive_device_lcdspi = {
.name = "spi-gpio", .name = "spi_gpio",
.id = 1, .id = 1,
.dev.platform_data = &jive_lcd_spi, .dev.platform_data = &jive_lcd_spi,
}; };
static struct gpiod_lookup_table jive_lcdspi_gpiod_table = {
.dev_id = "spi_gpio",
.table = {
GPIO_LOOKUP("GPIOG", 8,
"sck", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOB", 8,
"mosi", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOB", 7,
"cs", GPIO_ACTIVE_HIGH),
{ },
},
};
/* WM8750 audio code SPI definition */ /* WM8750 audio code SPI definition */
static struct spi_gpio_platform_data jive_wm8750_spi = { static struct spi_gpio_platform_data jive_wm8750_spi = {
.sck = S3C2410_GPB(4), .num_chipselect = 1,
.mosi = S3C2410_GPB(9),
.miso = SPI_GPIO_NO_MISO,
}; };
static struct platform_device jive_device_wm8750 = { static struct platform_device jive_device_wm8750 = {
.name = "spi-gpio", .name = "spi_gpio",
.id = 2, .id = 2,
.dev.platform_data = &jive_wm8750_spi, .dev.platform_data = &jive_wm8750_spi,
}; };
static struct gpiod_lookup_table jive_wm8750_gpiod_table = {
.dev_id = "spi_gpio",
.table = {
GPIO_LOOKUP("GPIOB", 4,
"gpio-sck", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOB", 9,
"gpio-mosi", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOH", 10,
"cs", GPIO_ACTIVE_HIGH),
{ },
},
};
/* JIVE SPI devices. */ /* JIVE SPI devices. */
static struct spi_board_info __initdata jive_spi_devs[] = { static struct spi_board_info __initdata jive_spi_devs[] = {
...@@ -424,14 +446,12 @@ static struct spi_board_info __initdata jive_spi_devs[] = { ...@@ -424,14 +446,12 @@ static struct spi_board_info __initdata jive_spi_devs[] = {
.mode = SPI_MODE_3, /* CPOL=1, CPHA=1 */ .mode = SPI_MODE_3, /* CPOL=1, CPHA=1 */
.max_speed_hz = 100000, .max_speed_hz = 100000,
.platform_data = &jive_lcm_config, .platform_data = &jive_lcm_config,
.controller_data = (void *)S3C2410_GPB(7),
}, { }, {
.modalias = "WM8750", .modalias = "WM8750",
.bus_num = 2, .bus_num = 2,
.chip_select = 0, .chip_select = 0,
.mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */ .mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */
.max_speed_hz = 100000, .max_speed_hz = 100000,
.controller_data = (void *)S3C2410_GPH(10),
}, },
}; };
...@@ -619,25 +639,12 @@ static void __init jive_machine_init(void) ...@@ -619,25 +639,12 @@ static void __init jive_machine_init(void)
/** TODO - check that this is after the cmdline option! */ /** TODO - check that this is after the cmdline option! */
s3c_nand_set_platdata(&jive_nand_info); s3c_nand_set_platdata(&jive_nand_info);
/* initialise the spi */
gpio_request(S3C2410_GPG(13), "lcm reset"); gpio_request(S3C2410_GPG(13), "lcm reset");
gpio_direction_output(S3C2410_GPG(13), 0); gpio_direction_output(S3C2410_GPG(13), 0);
gpio_request(S3C2410_GPB(7), "jive spi");
gpio_direction_output(S3C2410_GPB(7), 1);
gpio_request_one(S3C2410_GPB(6), GPIOF_OUT_INIT_LOW, NULL); gpio_request_one(S3C2410_GPB(6), GPIOF_OUT_INIT_LOW, NULL);
gpio_free(S3C2410_GPB(6)); gpio_free(S3C2410_GPB(6));
gpio_request_one(S3C2410_GPG(8), GPIOF_OUT_INIT_HIGH, NULL);
gpio_free(S3C2410_GPG(8));
/* initialise the WM8750 spi */
gpio_request(S3C2410_GPH(10), "jive wm8750 spi");
gpio_direction_output(S3C2410_GPH(10), 1);
/* Turn off suspend on both USB ports, and switch the /* Turn off suspend on both USB ports, and switch the
* selectable USB port to USB device mode. */ * selectable USB port to USB device mode. */
...@@ -655,6 +662,8 @@ static void __init jive_machine_init(void) ...@@ -655,6 +662,8 @@ static void __init jive_machine_init(void)
pm_power_off = jive_power_off; pm_power_off = jive_power_off;
gpiod_add_lookup_table(&jive_lcdspi_gpiod_table);
gpiod_add_lookup_table(&jive_wm8750_gpiod_table);
platform_add_devices(jive_devices, ARRAY_SIZE(jive_devices)); platform_add_devices(jive_devices, ARRAY_SIZE(jive_devices));
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio/machine.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
...@@ -194,17 +195,30 @@ static struct platform_device qt2410_led = { ...@@ -194,17 +195,30 @@ static struct platform_device qt2410_led = {
/* SPI */ /* SPI */
static struct spi_gpio_platform_data spi_gpio_cfg = { static struct spi_gpio_platform_data spi_gpio_cfg = {
.sck = S3C2410_GPG(7), .num_chipselect = 1,
.mosi = S3C2410_GPG(6),
.miso = S3C2410_GPG(5),
}; };
static struct platform_device qt2410_spi = { static struct platform_device qt2410_spi = {
.name = "spi-gpio", .name = "spi_gpio",
.id = 1, .id = 1,
.dev.platform_data = &spi_gpio_cfg, .dev.platform_data = &spi_gpio_cfg,
}; };
static struct gpiod_lookup_table qt2410_spi_gpiod_table = {
.dev_id = "spi_gpio",
.table = {
GPIO_LOOKUP("GPIOG", 7,
"sck", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOG", 6,
"mosi", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOG", 5,
"miso", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOB", 5,
"cs", GPIO_ACTIVE_HIGH),
{ },
},
};
/* Board devices */ /* Board devices */
static struct platform_device *qt2410_devices[] __initdata = { static struct platform_device *qt2410_devices[] __initdata = {
...@@ -323,9 +337,7 @@ static void __init qt2410_machine_init(void) ...@@ -323,9 +337,7 @@ static void __init qt2410_machine_init(void)
s3c24xx_udc_set_platdata(&qt2410_udc_cfg); s3c24xx_udc_set_platdata(&qt2410_udc_cfg);
s3c_i2c0_set_platdata(NULL); s3c_i2c0_set_platdata(NULL);
WARN_ON(gpio_request(S3C2410_GPB(5), "spi cs")); gpiod_add_lookup_table(&qt2410_spi_gpiod_table);
gpio_direction_output(S3C2410_GPB(5), 1);
platform_add_devices(qt2410_devices, ARRAY_SIZE(qt2410_devices)); platform_add_devices(qt2410_devices, ARRAY_SIZE(qt2410_devices));
s3c_pm_init(); s3c_pm_init();
} }
......
...@@ -206,17 +206,30 @@ static int __init smartq_lcd_setup_gpio(void) ...@@ -206,17 +206,30 @@ static int __init smartq_lcd_setup_gpio(void)
/* GPM0 -> CS */ /* GPM0 -> CS */
static struct spi_gpio_platform_data smartq_lcd_control = { static struct spi_gpio_platform_data smartq_lcd_control = {
.sck = S3C64XX_GPM(1), .num_chipselect = 1,
.mosi = S3C64XX_GPM(2),
.miso = S3C64XX_GPM(2),
}; };
static struct platform_device smartq_lcd_control_device = { static struct platform_device smartq_lcd_control_device = {
.name = "spi-gpio", .name = "spi_gpio",
.id = 1, .id = 1,
.dev.platform_data = &smartq_lcd_control, .dev.platform_data = &smartq_lcd_control,
}; };
static struct gpiod_lookup_table smartq_lcd_control_gpiod_table = {
.dev_id = "spi_gpio",
.table = {
GPIO_LOOKUP("GPIOM", 1,
"sck", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOM", 2,
"mosi", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOM", 3,
"miso", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOM", 0,
"cs", GPIO_ACTIVE_HIGH),
{ },
},
};
static void smartq_lcd_power_set(struct plat_lcd_data *pd, unsigned int power) static void smartq_lcd_power_set(struct plat_lcd_data *pd, unsigned int power)
{ {
gpio_direction_output(S3C64XX_GPM(3), power); gpio_direction_output(S3C64XX_GPM(3), power);
...@@ -404,6 +417,7 @@ void __init smartq_machine_init(void) ...@@ -404,6 +417,7 @@ void __init smartq_machine_init(void)
WARN_ON(smartq_wifi_init()); WARN_ON(smartq_wifi_init());
pwm_add_table(smartq_pwm_lookup, ARRAY_SIZE(smartq_pwm_lookup)); pwm_add_table(smartq_pwm_lookup, ARRAY_SIZE(smartq_pwm_lookup));
gpiod_add_lookup_table(&smartq_lcd_control_gpiod_table);
platform_add_devices(smartq_devices, ARRAY_SIZE(smartq_devices)); platform_add_devices(smartq_devices, ARRAY_SIZE(smartq_devices));
gpiod_add_lookup_table(&smartq_audio_gpios); gpiod_add_lookup_table(&smartq_audio_gpios);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio/machine.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/leds.h> #include <linux/leds.h>
...@@ -447,9 +448,6 @@ static struct ads7846_platform_data db1100_touch_pd = { ...@@ -447,9 +448,6 @@ static struct ads7846_platform_data db1100_touch_pd = {
}; };
static struct spi_gpio_platform_data db1100_spictl_pd = { static struct spi_gpio_platform_data db1100_spictl_pd = {
.sck = 209,
.mosi = 208,
.miso = 207,
.num_chipselect = 1, .num_chipselect = 1,
}; };
...@@ -462,7 +460,6 @@ static struct spi_board_info db1100_spi_info[] __initdata = { ...@@ -462,7 +460,6 @@ static struct spi_board_info db1100_spi_info[] __initdata = {
.mode = 0, .mode = 0,
.irq = AU1100_GPIO21_INT, .irq = AU1100_GPIO21_INT,
.platform_data = &db1100_touch_pd, .platform_data = &db1100_touch_pd,
.controller_data = (void *)210, /* for spi_gpio: CS# GPIO210 */
}, },
}; };
...@@ -474,6 +471,24 @@ static struct platform_device db1100_spi_dev = { ...@@ -474,6 +471,24 @@ static struct platform_device db1100_spi_dev = {
}, },
}; };
/*
* Alchemy GPIO 2 has its base at 200 so the GPIO lines
* 207 thru 210 are GPIOs at offset 7 thru 10 at this chip.
*/
static struct gpiod_lookup_table db1100_spi_gpiod_table = {
.dev_id = "spi_gpio",
.table = {
GPIO_LOOKUP("alchemy-gpio2", 9,
"sck", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("alchemy-gpio2", 8,
"mosi", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("alchemy-gpio2", 7,
"miso", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("alchemy-gpio2", 10,
"cs", GPIO_ACTIVE_HIGH),
{ },
},
};
static struct platform_device *db1x00_devs[] = { static struct platform_device *db1x00_devs[] = {
&db1x00_codec_dev, &db1x00_codec_dev,
...@@ -541,6 +556,7 @@ int __init db1000_dev_setup(void) ...@@ -541,6 +556,7 @@ int __init db1000_dev_setup(void)
clk_put(p); clk_put(p);
platform_add_devices(db1100_devs, ARRAY_SIZE(db1100_devs)); platform_add_devices(db1100_devs, ARRAY_SIZE(db1100_devs));
gpiod_add_lookup_table(&db1100_spi_gpiod_table);
platform_device_register(&db1100_spi_dev); platform_device_register(&db1100_spi_dev);
} else if (board == BCSR_WHOAMI_DB1000) { } else if (board == BCSR_WHOAMI_DB1000) {
c0 = AU1000_GPIO2_INT; c0 = AU1000_GPIO2_INT;
......
...@@ -313,25 +313,34 @@ static struct jz4740_fb_platform_data qi_lb60_fb_pdata = { ...@@ -313,25 +313,34 @@ static struct jz4740_fb_platform_data qi_lb60_fb_pdata = {
.pixclk_falling_edge = 1, .pixclk_falling_edge = 1,
}; };
struct spi_gpio_platform_data spigpio_platform_data = { struct spi_gpio_platform_data qi_lb60_spigpio_platform_data = {
.sck = JZ_GPIO_PORTC(23),
.mosi = JZ_GPIO_PORTC(22),
.miso = -1,
.num_chipselect = 1, .num_chipselect = 1,
}; };
static struct platform_device spigpio_device = { static struct platform_device qi_lb60_spigpio_device = {
.name = "spi_gpio", .name = "spi_gpio",
.id = 1, .id = 1,
.dev = { .dev = {
.platform_data = &spigpio_platform_data, .platform_data = &qi_lb60_spigpio_platform_data,
},
};
static struct gpiod_lookup_table qi_lb60_spigpio_gpio_table = {
.dev_id = "spi_gpio",
.table = {
GPIO_LOOKUP("GPIOC", 23,
"sck", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOC", 22,
"mosi", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("GPIOC", 21,
"cs", GPIO_ACTIVE_HIGH),
{ },
}, },
}; };
static struct spi_board_info qi_lb60_spi_board_info[] = { static struct spi_board_info qi_lb60_spi_board_info[] = {
{ {
.modalias = "ili8960", .modalias = "ili8960",
.controller_data = (void *)JZ_GPIO_PORTC(21),
.chip_select = 0, .chip_select = 0,
.bus_num = 1, .bus_num = 1,
.max_speed_hz = 30 * 1000, .max_speed_hz = 30 * 1000,
...@@ -435,7 +444,7 @@ static struct platform_device *jz_platform_devices[] __initdata = { ...@@ -435,7 +444,7 @@ static struct platform_device *jz_platform_devices[] __initdata = {
&jz4740_mmc_device, &jz4740_mmc_device,
&jz4740_nand_device, &jz4740_nand_device,
&qi_lb60_keypad, &qi_lb60_keypad,
&spigpio_device, &qi_lb60_spigpio_device,
&jz4740_framebuffer_device, &jz4740_framebuffer_device,
&jz4740_pcm_device, &jz4740_pcm_device,
&jz4740_i2s_device, &jz4740_i2s_device,
...@@ -489,6 +498,7 @@ static int __init qi_lb60_init_platform_devices(void) ...@@ -489,6 +498,7 @@ static int __init qi_lb60_init_platform_devices(void)
gpiod_add_lookup_table(&qi_lb60_audio_gpio_table); gpiod_add_lookup_table(&qi_lb60_audio_gpio_table);
gpiod_add_lookup_table(&qi_lb60_nand_gpio_table); gpiod_add_lookup_table(&qi_lb60_nand_gpio_table);
gpiod_add_lookup_table(&qi_lb60_spigpio_gpio_table);
spi_register_board_info(qi_lb60_spi_board_info, spi_register_board_info(qi_lb60_spi_board_info,
ARRAY_SIZE(qi_lb60_spi_board_info)); ARRAY_SIZE(qi_lb60_spi_board_info));
......
...@@ -7,9 +7,18 @@ ...@@ -7,9 +7,18 @@
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*
* FIXME: this driver is used on a device-tree probed platform: it
* should be defined as a bit-banged SPI device and probed from the device
* tree and not like this with static grabbing of a few numbered GPIO
* lines at random.
*
* Add proper SPI and EEPROM in arch/powerpc/boot/dts/digsy_mtc.dts
* and delete this driver.
*/ */
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio/machine.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
...@@ -42,9 +51,6 @@ struct eeprom_93xx46_platform_data digsy_mtc_eeprom_data = { ...@@ -42,9 +51,6 @@ struct eeprom_93xx46_platform_data digsy_mtc_eeprom_data = {
}; };
static struct spi_gpio_platform_data eeprom_spi_gpio_data = { static struct spi_gpio_platform_data eeprom_spi_gpio_data = {
.sck = GPIO_EEPROM_CLK,
.mosi = GPIO_EEPROM_DI,
.miso = GPIO_EEPROM_DO,
.num_chipselect = 1, .num_chipselect = 1,
}; };
...@@ -56,6 +62,21 @@ static struct platform_device digsy_mtc_eeprom = { ...@@ -56,6 +62,21 @@ static struct platform_device digsy_mtc_eeprom = {
}, },
}; };
static struct gpiod_lookup_table eeprom_spi_gpiod_table = {
.dev_id = "spi_gpio",
.table = {
GPIO_LOOKUP("gpio@b00", GPIO_EEPROM_CLK,
"sck", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio@b00", GPIO_EEPROM_DI,
"mosi", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio@b00", GPIO_EEPROM_DO,
"miso", GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("gpio@b00", GPIO_EEPROM_CS,
"cs", GPIO_ACTIVE_HIGH),
{ },
},
};
static struct spi_board_info digsy_mtc_eeprom_info[] __initdata = { static struct spi_board_info digsy_mtc_eeprom_info[] __initdata = {
{ {
.modalias = "93xx46", .modalias = "93xx46",
...@@ -63,7 +84,6 @@ static struct spi_board_info digsy_mtc_eeprom_info[] __initdata = { ...@@ -63,7 +84,6 @@ static struct spi_board_info digsy_mtc_eeprom_info[] __initdata = {
.bus_num = EE_SPI_BUS_NUM, .bus_num = EE_SPI_BUS_NUM,
.chip_select = 0, .chip_select = 0,
.mode = SPI_MODE_0, .mode = SPI_MODE_0,
.controller_data = (void *)GPIO_EEPROM_CS,
.platform_data = &digsy_mtc_eeprom_data, .platform_data = &digsy_mtc_eeprom_data,
}, },
}; };
...@@ -78,6 +98,7 @@ static int __init digsy_mtc_eeprom_devices_init(void) ...@@ -78,6 +98,7 @@ static int __init digsy_mtc_eeprom_devices_init(void)
pr_err("can't request gpio %d\n", GPIO_EEPROM_OE); pr_err("can't request gpio %d\n", GPIO_EEPROM_OE);
return ret; return ret;
} }
gpiod_add_lookup_table(&eeprom_spi_gpiod_table);
spi_register_board_info(digsy_mtc_eeprom_info, spi_register_board_info(digsy_mtc_eeprom_info,
ARRAY_SIZE(digsy_mtc_eeprom_info)); ARRAY_SIZE(digsy_mtc_eeprom_info));
return platform_device_register(&digsy_mtc_eeprom); return platform_device_register(&digsy_mtc_eeprom);
......
...@@ -768,14 +768,14 @@ static int atmel_spi_next_xfer_dma_submit(struct spi_master *master, ...@@ -768,14 +768,14 @@ static int atmel_spi_next_xfer_dma_submit(struct spi_master *master,
rxdesc = dmaengine_prep_slave_single(rxchan, rxdesc = dmaengine_prep_slave_single(rxchan,
as->dma_addr_rx_bbuf, as->dma_addr_rx_bbuf,
xfer->len, xfer->len,
DMA_FROM_DEVICE, DMA_DEV_TO_MEM,
DMA_PREP_INTERRUPT | DMA_PREP_INTERRUPT |
DMA_CTRL_ACK); DMA_CTRL_ACK);
} else { } else {
rxdesc = dmaengine_prep_slave_sg(rxchan, rxdesc = dmaengine_prep_slave_sg(rxchan,
xfer->rx_sg.sgl, xfer->rx_sg.sgl,
xfer->rx_sg.nents, xfer->rx_sg.nents,
DMA_FROM_DEVICE, DMA_DEV_TO_MEM,
DMA_PREP_INTERRUPT | DMA_PREP_INTERRUPT |
DMA_CTRL_ACK); DMA_CTRL_ACK);
} }
...@@ -787,14 +787,14 @@ static int atmel_spi_next_xfer_dma_submit(struct spi_master *master, ...@@ -787,14 +787,14 @@ static int atmel_spi_next_xfer_dma_submit(struct spi_master *master,
memcpy(as->addr_tx_bbuf, xfer->tx_buf, xfer->len); memcpy(as->addr_tx_bbuf, xfer->tx_buf, xfer->len);
txdesc = dmaengine_prep_slave_single(txchan, txdesc = dmaengine_prep_slave_single(txchan,
as->dma_addr_tx_bbuf, as->dma_addr_tx_bbuf,
xfer->len, DMA_TO_DEVICE, xfer->len, DMA_MEM_TO_DEV,
DMA_PREP_INTERRUPT | DMA_PREP_INTERRUPT |
DMA_CTRL_ACK); DMA_CTRL_ACK);
} else { } else {
txdesc = dmaengine_prep_slave_sg(txchan, txdesc = dmaengine_prep_slave_sg(txchan,
xfer->tx_sg.sgl, xfer->tx_sg.sgl,
xfer->tx_sg.nents, xfer->tx_sg.nents,
DMA_TO_DEVICE, DMA_MEM_TO_DEV,
DMA_PREP_INTERRUPT | DMA_PREP_INTERRUPT |
DMA_CTRL_ACK); DMA_CTRL_ACK);
} }
......
...@@ -1247,7 +1247,7 @@ int bcm_qspi_probe(struct platform_device *pdev, ...@@ -1247,7 +1247,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
qspi->base[MSPI] = devm_ioremap_resource(dev, res); qspi->base[MSPI] = devm_ioremap_resource(dev, res);
if (IS_ERR(qspi->base[MSPI])) { if (IS_ERR(qspi->base[MSPI])) {
ret = PTR_ERR(qspi->base[MSPI]); ret = PTR_ERR(qspi->base[MSPI]);
goto qspi_probe_err; goto qspi_resource_err;
} }
} else { } else {
goto qspi_resource_err; goto qspi_resource_err;
...@@ -1258,7 +1258,7 @@ int bcm_qspi_probe(struct platform_device *pdev, ...@@ -1258,7 +1258,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
qspi->base[BSPI] = devm_ioremap_resource(dev, res); qspi->base[BSPI] = devm_ioremap_resource(dev, res);
if (IS_ERR(qspi->base[BSPI])) { if (IS_ERR(qspi->base[BSPI])) {
ret = PTR_ERR(qspi->base[BSPI]); ret = PTR_ERR(qspi->base[BSPI]);
goto qspi_probe_err; goto qspi_resource_err;
} }
qspi->bspi_mode = true; qspi->bspi_mode = true;
} else { } else {
......
...@@ -321,7 +321,6 @@ static int bcm2835aux_spi_transfer_one(struct spi_master *master, ...@@ -321,7 +321,6 @@ static int bcm2835aux_spi_transfer_one(struct spi_master *master,
struct bcm2835aux_spi *bs = spi_master_get_devdata(master); struct bcm2835aux_spi *bs = spi_master_get_devdata(master);
unsigned long spi_hz, clk_hz, speed; unsigned long spi_hz, clk_hz, speed;
unsigned long spi_used_hz; unsigned long spi_used_hz;
unsigned long long xfer_time_us;
/* calculate the registers to handle /* calculate the registers to handle
* *
...@@ -358,20 +357,21 @@ static int bcm2835aux_spi_transfer_one(struct spi_master *master, ...@@ -358,20 +357,21 @@ static int bcm2835aux_spi_transfer_one(struct spi_master *master,
bs->rx_len = tfr->len; bs->rx_len = tfr->len;
bs->pending = 0; bs->pending = 0;
/* calculate the estimated time in us the transfer runs /* Calculate the estimated time in us the transfer runs. Note that
* note that there are are 2 idle clocks after each * there are are 2 idle clocks cycles after each chunk getting
* chunk getting transferred - in our case the chunk size * transferred - in our case the chunk size is 3 bytes, so we
* is 3 bytes, so we approximate this by 9 bits/byte * approximate this by 9 cycles/byte. This is used to find the number
* of Hz per byte per polling limit. E.g., we can transfer 1 byte in
* 30 µs per 300,000 Hz of bus clock.
*/ */
xfer_time_us = tfr->len * 9 * 1000000; #define HZ_PER_BYTE ((9 * 1000000) / BCM2835_AUX_SPI_POLLING_LIMIT_US)
do_div(xfer_time_us, spi_used_hz);
/* run in polling mode for short transfers */ /* run in polling mode for short transfers */
if (xfer_time_us < BCM2835_AUX_SPI_POLLING_LIMIT_US) if (tfr->len < spi_used_hz / HZ_PER_BYTE)
return bcm2835aux_spi_transfer_one_poll(master, spi, tfr); return bcm2835aux_spi_transfer_one_poll(master, spi, tfr);
/* run in interrupt mode for all others */ /* run in interrupt mode for all others */
return bcm2835aux_spi_transfer_one_irq(master, spi, tfr); return bcm2835aux_spi_transfer_one_irq(master, spi, tfr);
#undef HZ_PER_BYTE
} }
static int bcm2835aux_spi_prepare_message(struct spi_master *master, static int bcm2835aux_spi_prepare_message(struct spi_master *master,
......
...@@ -112,10 +112,10 @@ static irqreturn_t dma_transfer(struct dw_spi *dws) ...@@ -112,10 +112,10 @@ static irqreturn_t dma_transfer(struct dw_spi *dws)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static bool mid_spi_can_dma(struct spi_master *master, struct spi_device *spi, static bool mid_spi_can_dma(struct spi_controller *master,
struct spi_transfer *xfer) struct spi_device *spi, struct spi_transfer *xfer)
{ {
struct dw_spi *dws = spi_master_get_devdata(master); struct dw_spi *dws = spi_controller_get_devdata(master);
if (!dws->dma_inited) if (!dws->dma_inited)
return false; return false;
......
...@@ -135,7 +135,7 @@ static inline void dw_spi_debugfs_remove(struct dw_spi *dws) ...@@ -135,7 +135,7 @@ static inline void dw_spi_debugfs_remove(struct dw_spi *dws)
static void dw_spi_set_cs(struct spi_device *spi, bool enable) static void dw_spi_set_cs(struct spi_device *spi, bool enable)
{ {
struct dw_spi *dws = spi_master_get_devdata(spi->master); struct dw_spi *dws = spi_controller_get_devdata(spi->controller);
struct chip_data *chip = spi_get_ctldata(spi); struct chip_data *chip = spi_get_ctldata(spi);
/* Chip select logic is inverted from spi_set_cs() */ /* Chip select logic is inverted from spi_set_cs() */
...@@ -250,8 +250,8 @@ static irqreturn_t interrupt_transfer(struct dw_spi *dws) ...@@ -250,8 +250,8 @@ static irqreturn_t interrupt_transfer(struct dw_spi *dws)
static irqreturn_t dw_spi_irq(int irq, void *dev_id) static irqreturn_t dw_spi_irq(int irq, void *dev_id)
{ {
struct spi_master *master = dev_id; struct spi_controller *master = dev_id;
struct dw_spi *dws = spi_master_get_devdata(master); struct dw_spi *dws = spi_controller_get_devdata(master);
u16 irq_status = dw_readl(dws, DW_SPI_ISR) & 0x3f; u16 irq_status = dw_readl(dws, DW_SPI_ISR) & 0x3f;
if (!irq_status) if (!irq_status)
...@@ -277,10 +277,10 @@ static int poll_transfer(struct dw_spi *dws) ...@@ -277,10 +277,10 @@ static int poll_transfer(struct dw_spi *dws)
return 0; return 0;
} }
static int dw_spi_transfer_one(struct spi_master *master, static int dw_spi_transfer_one(struct spi_controller *master,
struct spi_device *spi, struct spi_transfer *transfer) struct spi_device *spi, struct spi_transfer *transfer)
{ {
struct dw_spi *dws = spi_master_get_devdata(master); struct dw_spi *dws = spi_controller_get_devdata(master);
struct chip_data *chip = spi_get_ctldata(spi); struct chip_data *chip = spi_get_ctldata(spi);
u8 imask = 0; u8 imask = 0;
u16 txlevel = 0; u16 txlevel = 0;
...@@ -383,10 +383,10 @@ static int dw_spi_transfer_one(struct spi_master *master, ...@@ -383,10 +383,10 @@ static int dw_spi_transfer_one(struct spi_master *master,
return 1; return 1;
} }
static void dw_spi_handle_err(struct spi_master *master, static void dw_spi_handle_err(struct spi_controller *master,
struct spi_message *msg) struct spi_message *msg)
{ {
struct dw_spi *dws = spi_master_get_devdata(master); struct dw_spi *dws = spi_controller_get_devdata(master);
if (dws->dma_mapped) if (dws->dma_mapped)
dws->dma_ops->dma_stop(dws); dws->dma_ops->dma_stop(dws);
...@@ -471,7 +471,7 @@ static void spi_hw_init(struct device *dev, struct dw_spi *dws) ...@@ -471,7 +471,7 @@ static void spi_hw_init(struct device *dev, struct dw_spi *dws)
int dw_spi_add_host(struct device *dev, struct dw_spi *dws) int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
{ {
struct spi_master *master; struct spi_controller *master;
int ret; int ret;
BUG_ON(dws == NULL); BUG_ON(dws == NULL);
...@@ -518,8 +518,8 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) ...@@ -518,8 +518,8 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
} }
} }
spi_master_set_devdata(master, dws); spi_controller_set_devdata(master, dws);
ret = devm_spi_register_master(dev, master); ret = devm_spi_register_controller(dev, master);
if (ret) { if (ret) {
dev_err(&master->dev, "problem registering spi master\n"); dev_err(&master->dev, "problem registering spi master\n");
goto err_dma_exit; goto err_dma_exit;
...@@ -534,7 +534,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) ...@@ -534,7 +534,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
spi_enable_chip(dws, 0); spi_enable_chip(dws, 0);
free_irq(dws->irq, master); free_irq(dws->irq, master);
err_free_master: err_free_master:
spi_master_put(master); spi_controller_put(master);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(dw_spi_add_host); EXPORT_SYMBOL_GPL(dw_spi_add_host);
...@@ -556,7 +556,7 @@ int dw_spi_suspend_host(struct dw_spi *dws) ...@@ -556,7 +556,7 @@ int dw_spi_suspend_host(struct dw_spi *dws)
{ {
int ret; int ret;
ret = spi_master_suspend(dws->master); ret = spi_controller_suspend(dws->master);
if (ret) if (ret)
return ret; return ret;
...@@ -570,7 +570,7 @@ int dw_spi_resume_host(struct dw_spi *dws) ...@@ -570,7 +570,7 @@ int dw_spi_resume_host(struct dw_spi *dws)
int ret; int ret;
spi_hw_init(&dws->master->dev, dws); spi_hw_init(&dws->master->dev, dws);
ret = spi_master_resume(dws->master); ret = spi_controller_resume(dws->master);
if (ret) if (ret)
dev_err(&dws->master->dev, "fail to start queue (%d)\n", ret); dev_err(&dws->master->dev, "fail to start queue (%d)\n", ret);
return ret; return ret;
......
...@@ -93,14 +93,14 @@ struct dw_spi_dma_ops { ...@@ -93,14 +93,14 @@ struct dw_spi_dma_ops {
int (*dma_init)(struct dw_spi *dws); int (*dma_init)(struct dw_spi *dws);
void (*dma_exit)(struct dw_spi *dws); void (*dma_exit)(struct dw_spi *dws);
int (*dma_setup)(struct dw_spi *dws, struct spi_transfer *xfer); int (*dma_setup)(struct dw_spi *dws, struct spi_transfer *xfer);
bool (*can_dma)(struct spi_master *master, struct spi_device *spi, bool (*can_dma)(struct spi_controller *master, struct spi_device *spi,
struct spi_transfer *xfer); struct spi_transfer *xfer);
int (*dma_transfer)(struct dw_spi *dws, struct spi_transfer *xfer); int (*dma_transfer)(struct dw_spi *dws, struct spi_transfer *xfer);
void (*dma_stop)(struct dw_spi *dws); void (*dma_stop)(struct dw_spi *dws);
}; };
struct dw_spi { struct dw_spi {
struct spi_master *master; struct spi_controller *master;
enum dw_ssi_type type; enum dw_ssi_type type;
void __iomem *regs; void __iomem *regs;
......
This diff is collapsed.
...@@ -8,64 +8,17 @@ ...@@ -8,64 +8,17 @@
* - id the same as the SPI bus number it implements * - id the same as the SPI bus number it implements
* - dev.platform data pointing to a struct spi_gpio_platform_data * - dev.platform data pointing to a struct spi_gpio_platform_data
* *
* Or, see the driver code for information about speedups that are * Use spi_board_info with these busses in the usual way.
* possible on platforms that support inlined access for GPIOs (no
* spi_gpio_platform_data is used).
*
* Use spi_board_info with these busses in the usual way, being sure
* that the controller_data being the GPIO used for each device's
* chipselect:
*
* static struct spi_board_info ... [] = {
* ...
* // this slave uses GPIO 42 for its chipselect
* .controller_data = (void *) 42,
* ...
* // this one uses GPIO 86 for its chipselect
* .controller_data = (void *) 86,
* ...
* };
*
* If chipselect is not used (there's only one device on the bus), assign
* SPI_GPIO_NO_CHIPSELECT to the controller_data:
* .controller_data = (void *) SPI_GPIO_NO_CHIPSELECT;
*
* If the MISO or MOSI pin is not available then it should be set to
* SPI_GPIO_NO_MISO or SPI_GPIO_NO_MOSI.
* *
* If the bitbanged bus is later switched to a "native" controller, * If the bitbanged bus is later switched to a "native" controller,
* that platform_device and controller_data should be removed. * that platform_device and controller_data should be removed.
*/ */
#define SPI_GPIO_NO_CHIPSELECT ((unsigned long)-1l)
#define SPI_GPIO_NO_MISO ((unsigned long)-1l)
#define SPI_GPIO_NO_MOSI ((unsigned long)-1l)
/** /**
* struct spi_gpio_platform_data - parameter for bitbanged SPI master * struct spi_gpio_platform_data - parameter for bitbanged SPI master
* @sck: number of the GPIO used for clock output
* @mosi: number of the GPIO used for Master Output, Slave In (MOSI) data
* @miso: number of the GPIO used for Master Input, Slave Output (MISO) data
* @num_chipselect: how many slaves to allow * @num_chipselect: how many slaves to allow
*
* All GPIO signals used with the SPI bus managed through this driver
* (chipselects, MOSI, MISO, SCK) must be configured as GPIOs, instead
* of some alternate function.
*
* It can be convenient to use this driver with pins that have alternate
* functions associated with a "native" SPI controller if a driver for that
* controller is not available, or is missing important functionality.
*
* On platforms which can do so, configure MISO with a weak pullup unless
* there's an external pullup on that signal. That saves power by avoiding
* floating signals. (A weak pulldown would save power too, but many
* drivers expect to see all-ones data as the no slave "response".)
*/ */
struct spi_gpio_platform_data { struct spi_gpio_platform_data {
unsigned sck;
unsigned long mosi;
unsigned long miso;
u16 num_chipselect; u16 num_chipselect;
}; };
......
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