mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-30 13:38:40 +00:00
Merge remote-tracking branches 'spi/topic/sh-msiof', 'spi/topic/stm32', 'spi/topic/sunxi', 'spi/topic/tegra' and 'spi/topic/tools' into spi-next
This commit is contained in:
commit
2dcfd2814b
@ -6,6 +6,7 @@ Required properties:
|
|||||||
"renesas,msiof-r8a7792" (R-Car V2H)
|
"renesas,msiof-r8a7792" (R-Car V2H)
|
||||||
"renesas,msiof-r8a7793" (R-Car M2-N)
|
"renesas,msiof-r8a7793" (R-Car M2-N)
|
||||||
"renesas,msiof-r8a7794" (R-Car E2)
|
"renesas,msiof-r8a7794" (R-Car E2)
|
||||||
|
"renesas,msiof-r8a7795" (R-Car H3)
|
||||||
"renesas,msiof-r8a7796" (R-Car M3-W)
|
"renesas,msiof-r8a7796" (R-Car M3-W)
|
||||||
"renesas,msiof-sh73a0" (SH-Mobile AG5)
|
"renesas,msiof-sh73a0" (SH-Mobile AG5)
|
||||||
"renesas,sh-mobile-msiof" (generic SH-Mobile compatibile device)
|
"renesas,sh-mobile-msiof" (generic SH-Mobile compatibile device)
|
||||||
|
@ -38,6 +38,7 @@ struct sh_msiof_chipdata {
|
|||||||
u16 tx_fifo_size;
|
u16 tx_fifo_size;
|
||||||
u16 rx_fifo_size;
|
u16 rx_fifo_size;
|
||||||
u16 master_flags;
|
u16 master_flags;
|
||||||
|
u16 min_div;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sh_msiof_spi_priv {
|
struct sh_msiof_spi_priv {
|
||||||
@ -49,6 +50,7 @@ struct sh_msiof_spi_priv {
|
|||||||
struct completion done;
|
struct completion done;
|
||||||
unsigned int tx_fifo_size;
|
unsigned int tx_fifo_size;
|
||||||
unsigned int rx_fifo_size;
|
unsigned int rx_fifo_size;
|
||||||
|
unsigned int min_div;
|
||||||
void *tx_dma_page;
|
void *tx_dma_page;
|
||||||
void *rx_dma_page;
|
void *rx_dma_page;
|
||||||
dma_addr_t tx_dma_addr;
|
dma_addr_t tx_dma_addr;
|
||||||
@ -261,6 +263,8 @@ static void sh_msiof_spi_set_clk_regs(struct sh_msiof_spi_priv *p,
|
|||||||
if (!WARN_ON(!spi_hz || !parent_rate))
|
if (!WARN_ON(!spi_hz || !parent_rate))
|
||||||
div = DIV_ROUND_UP(parent_rate, spi_hz);
|
div = DIV_ROUND_UP(parent_rate, spi_hz);
|
||||||
|
|
||||||
|
div = max_t(unsigned long, div, p->min_div);
|
||||||
|
|
||||||
for (k = 0; k < ARRAY_SIZE(sh_msiof_spi_div_table); k++) {
|
for (k = 0; k < ARRAY_SIZE(sh_msiof_spi_div_table); k++) {
|
||||||
brps = DIV_ROUND_UP(div, sh_msiof_spi_div_table[k].div);
|
brps = DIV_ROUND_UP(div, sh_msiof_spi_div_table[k].div);
|
||||||
/* SCR_BRDV_DIV_1 is valid only if BRPS is x 1/1 or x 1/2 */
|
/* SCR_BRDV_DIV_1 is valid only if BRPS is x 1/1 or x 1/2 */
|
||||||
@ -998,24 +1002,33 @@ static const struct sh_msiof_chipdata sh_data = {
|
|||||||
.tx_fifo_size = 64,
|
.tx_fifo_size = 64,
|
||||||
.rx_fifo_size = 64,
|
.rx_fifo_size = 64,
|
||||||
.master_flags = 0,
|
.master_flags = 0,
|
||||||
|
.min_div = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct sh_msiof_chipdata r8a779x_data = {
|
static const struct sh_msiof_chipdata rcar_gen2_data = {
|
||||||
.tx_fifo_size = 64,
|
.tx_fifo_size = 64,
|
||||||
.rx_fifo_size = 64,
|
.rx_fifo_size = 64,
|
||||||
.master_flags = SPI_MASTER_MUST_TX,
|
.master_flags = SPI_MASTER_MUST_TX,
|
||||||
|
.min_div = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct sh_msiof_chipdata rcar_gen3_data = {
|
||||||
|
.tx_fifo_size = 64,
|
||||||
|
.rx_fifo_size = 64,
|
||||||
|
.master_flags = SPI_MASTER_MUST_TX,
|
||||||
|
.min_div = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct of_device_id sh_msiof_match[] = {
|
static const struct of_device_id sh_msiof_match[] = {
|
||||||
{ .compatible = "renesas,sh-mobile-msiof", .data = &sh_data },
|
{ .compatible = "renesas,sh-mobile-msiof", .data = &sh_data },
|
||||||
{ .compatible = "renesas,msiof-r8a7790", .data = &r8a779x_data },
|
{ .compatible = "renesas,msiof-r8a7790", .data = &rcar_gen2_data },
|
||||||
{ .compatible = "renesas,msiof-r8a7791", .data = &r8a779x_data },
|
{ .compatible = "renesas,msiof-r8a7791", .data = &rcar_gen2_data },
|
||||||
{ .compatible = "renesas,msiof-r8a7792", .data = &r8a779x_data },
|
{ .compatible = "renesas,msiof-r8a7792", .data = &rcar_gen2_data },
|
||||||
{ .compatible = "renesas,msiof-r8a7793", .data = &r8a779x_data },
|
{ .compatible = "renesas,msiof-r8a7793", .data = &rcar_gen2_data },
|
||||||
{ .compatible = "renesas,msiof-r8a7794", .data = &r8a779x_data },
|
{ .compatible = "renesas,msiof-r8a7794", .data = &rcar_gen2_data },
|
||||||
{ .compatible = "renesas,rcar-gen2-msiof", .data = &r8a779x_data },
|
{ .compatible = "renesas,rcar-gen2-msiof", .data = &rcar_gen2_data },
|
||||||
{ .compatible = "renesas,msiof-r8a7796", .data = &r8a779x_data },
|
{ .compatible = "renesas,msiof-r8a7796", .data = &rcar_gen3_data },
|
||||||
{ .compatible = "renesas,rcar-gen3-msiof", .data = &r8a779x_data },
|
{ .compatible = "renesas,rcar-gen3-msiof", .data = &rcar_gen3_data },
|
||||||
{ .compatible = "renesas,sh-msiof", .data = &sh_data }, /* Deprecated */
|
{ .compatible = "renesas,sh-msiof", .data = &sh_data }, /* Deprecated */
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
@ -1230,6 +1243,7 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
|
|||||||
platform_set_drvdata(pdev, p);
|
platform_set_drvdata(pdev, p);
|
||||||
p->master = master;
|
p->master = master;
|
||||||
p->info = info;
|
p->info = info;
|
||||||
|
p->min_div = chipdata->min_div;
|
||||||
|
|
||||||
init_completion(&p->done);
|
init_completion(&p->done);
|
||||||
|
|
||||||
|
@ -1132,7 +1132,7 @@ static int stm32_spi_probe(struct platform_device *pdev)
|
|||||||
goto err_master_put;
|
goto err_master_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
spi->rst = devm_reset_control_get(&pdev->dev, NULL);
|
spi->rst = devm_reset_control_get_exclusive(&pdev->dev, NULL);
|
||||||
if (!IS_ERR(spi->rst)) {
|
if (!IS_ERR(spi->rst)) {
|
||||||
reset_control_assert(spi->rst);
|
reset_control_assert(spi->rst);
|
||||||
udelay(2);
|
udelay(2);
|
||||||
|
@ -502,7 +502,7 @@ static int sun6i_spi_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
init_completion(&sspi->done);
|
init_completion(&sspi->done);
|
||||||
|
|
||||||
sspi->rstc = devm_reset_control_get(&pdev->dev, NULL);
|
sspi->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
|
||||||
if (IS_ERR(sspi->rstc)) {
|
if (IS_ERR(sspi->rstc)) {
|
||||||
dev_err(&pdev->dev, "Couldn't get reset controller\n");
|
dev_err(&pdev->dev, "Couldn't get reset controller\n");
|
||||||
ret = PTR_ERR(sspi->rstc);
|
ret = PTR_ERR(sspi->rstc);
|
||||||
|
@ -1083,7 +1083,7 @@ static int tegra_spi_probe(struct platform_device *pdev)
|
|||||||
goto exit_free_irq;
|
goto exit_free_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
tspi->rst = devm_reset_control_get(&pdev->dev, "spi");
|
tspi->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi");
|
||||||
if (IS_ERR(tspi->rst)) {
|
if (IS_ERR(tspi->rst)) {
|
||||||
dev_err(&pdev->dev, "can not get reset\n");
|
dev_err(&pdev->dev, "can not get reset\n");
|
||||||
ret = PTR_ERR(tspi->rst);
|
ret = PTR_ERR(tspi->rst);
|
||||||
|
@ -485,7 +485,7 @@ static int tegra_sflash_probe(struct platform_device *pdev)
|
|||||||
goto exit_free_irq;
|
goto exit_free_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsd->rst = devm_reset_control_get(&pdev->dev, "spi");
|
tsd->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi");
|
||||||
if (IS_ERR(tsd->rst)) {
|
if (IS_ERR(tsd->rst)) {
|
||||||
dev_err(&pdev->dev, "can not get reset\n");
|
dev_err(&pdev->dev, "can not get reset\n");
|
||||||
ret = PTR_ERR(tsd->rst);
|
ret = PTR_ERR(tsd->rst);
|
||||||
|
@ -1081,7 +1081,7 @@ static int tegra_slink_probe(struct platform_device *pdev)
|
|||||||
goto exit_free_irq;
|
goto exit_free_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
tspi->rst = devm_reset_control_get(&pdev->dev, "spi");
|
tspi->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi");
|
||||||
if (IS_ERR(tspi->rst)) {
|
if (IS_ERR(tspi->rst)) {
|
||||||
dev_err(&pdev->dev, "can not get reset\n");
|
dev_err(&pdev->dev, "can not get reset\n");
|
||||||
ret = PTR_ERR(tspi->rst);
|
ret = PTR_ERR(tspi->rst);
|
||||||
|
@ -91,7 +91,7 @@ kvm_stat: FORCE
|
|||||||
$(call descend,kvm/$@)
|
$(call descend,kvm/$@)
|
||||||
|
|
||||||
all: acpi cgroup cpupower gpio hv firewire lguest liblockdep \
|
all: acpi cgroup cpupower gpio hv firewire lguest liblockdep \
|
||||||
perf selftests turbostat usb \
|
perf selftests spi turbostat usb \
|
||||||
virtio vm net x86_energy_perf_policy \
|
virtio vm net x86_energy_perf_policy \
|
||||||
tmon freefall objtool kvm_stat
|
tmon freefall objtool kvm_stat
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ acpi_install:
|
|||||||
cpupower_install:
|
cpupower_install:
|
||||||
$(call descend,power/$(@:_install=),install)
|
$(call descend,power/$(@:_install=),install)
|
||||||
|
|
||||||
cgroup_install firewire_install gpio_install hv_install lguest_install perf_install usb_install virtio_install vm_install net_install objtool_install:
|
cgroup_install firewire_install gpio_install hv_install lguest_install perf_install spi_install usb_install virtio_install vm_install net_install objtool_install:
|
||||||
$(call descend,$(@:_install=),install)
|
$(call descend,$(@:_install=),install)
|
||||||
|
|
||||||
liblockdep_install:
|
liblockdep_install:
|
||||||
|
2
tools/spi/Build
Normal file
2
tools/spi/Build
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
spidev_test-y += spidev_test.o
|
||||||
|
spidev_fdx-y += spidev_fdx.o
|
@ -1,6 +1,66 @@
|
|||||||
CC = $(CROSS_COMPILE)gcc
|
include ../scripts/Makefile.include
|
||||||
|
|
||||||
all: spidev_test spidev_fdx
|
bindir ?= /usr/bin
|
||||||
|
|
||||||
|
ifeq ($(srctree),)
|
||||||
|
srctree := $(patsubst %/,%,$(dir $(CURDIR)))
|
||||||
|
srctree := $(patsubst %/,%,$(dir $(srctree)))
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Do not use make's built-in rules
|
||||||
|
# (this improves performance and avoids hard-to-debug behaviour);
|
||||||
|
MAKEFLAGS += -r
|
||||||
|
|
||||||
|
CC = $(CROSS_COMPILE)gcc
|
||||||
|
LD = $(CROSS_COMPILE)ld
|
||||||
|
CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include
|
||||||
|
|
||||||
|
ALL_TARGETS := spidev_test spidev_fdx
|
||||||
|
ALL_PROGRAMS := $(patsubst %,$(OUTPUT)%,$(ALL_TARGETS))
|
||||||
|
|
||||||
|
all: $(ALL_PROGRAMS)
|
||||||
|
|
||||||
|
export srctree OUTPUT CC LD CFLAGS
|
||||||
|
include $(srctree)/tools/build/Makefile.include
|
||||||
|
|
||||||
|
#
|
||||||
|
# We need the following to be outside of kernel tree
|
||||||
|
#
|
||||||
|
$(OUTPUT)include/linux/spi/spidev.h: ../../include/uapi/linux/spi/spidev.h
|
||||||
|
mkdir -p $(OUTPUT)include/linux/spi 2>&1 || true
|
||||||
|
ln -sf $(CURDIR)/../../include/uapi/linux/spi/spidev.h $@
|
||||||
|
|
||||||
|
prepare: $(OUTPUT)include/linux/spi/spidev.h
|
||||||
|
|
||||||
|
#
|
||||||
|
# spidev_test
|
||||||
|
#
|
||||||
|
SPIDEV_TEST_IN := $(OUTPUT)spidev_test-in.o
|
||||||
|
$(SPIDEV_TEST_IN): prepare FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=spidev_test
|
||||||
|
$(OUTPUT)spidev_test: $(SPIDEV_TEST_IN)
|
||||||
|
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
||||||
|
|
||||||
|
#
|
||||||
|
# spidev_fdx
|
||||||
|
#
|
||||||
|
SPIDEV_FDX_IN := $(OUTPUT)spidev_fdx-in.o
|
||||||
|
$(SPIDEV_FDX_IN): prepare FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=spidev_fdx
|
||||||
|
$(OUTPUT)spidev_fdx: $(SPIDEV_FDX_IN)
|
||||||
|
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) spidev_test spidev_fdx
|
rm -f $(ALL_PROGRAMS)
|
||||||
|
rm -f $(OUTPUT)include/linux/spi/spidev.h
|
||||||
|
find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.d' -delete
|
||||||
|
|
||||||
|
install: $(ALL_PROGRAMS)
|
||||||
|
install -d -m 755 $(DESTDIR)$(bindir); \
|
||||||
|
for program in $(ALL_PROGRAMS); do \
|
||||||
|
install $$program $(DESTDIR)$(bindir); \
|
||||||
|
done
|
||||||
|
|
||||||
|
FORCE:
|
||||||
|
|
||||||
|
.PHONY: all install clean FORCE prepare
|
||||||
|
Loading…
Reference in New Issue
Block a user