Loading drivers/spi/spi-mpc512x-psc.c +30 −18 Original line number Original line Diff line number Diff line Loading @@ -38,7 +38,8 @@ struct mpc512x_psc_spi { struct mpc512x_psc_fifo __iomem *fifo; struct mpc512x_psc_fifo __iomem *fifo; unsigned int irq; unsigned int irq; u8 bits_per_word; u8 bits_per_word; u32 mclk; struct clk *clk_mclk; u32 mclk_rate; struct completion txisrdone; struct completion txisrdone; }; }; Loading Loading @@ -72,6 +73,7 @@ static void mpc512x_psc_spi_activate_cs(struct spi_device *spi) struct mpc52xx_psc __iomem *psc = mps->psc; struct mpc52xx_psc __iomem *psc = mps->psc; u32 sicr; u32 sicr; u32 ccr; u32 ccr; int speed; u16 bclkdiv; u16 bclkdiv; sicr = in_be32(&psc->sicr); sicr = in_be32(&psc->sicr); Loading @@ -95,10 +97,10 @@ static void mpc512x_psc_spi_activate_cs(struct spi_device *spi) ccr = in_be32(&psc->ccr); ccr = in_be32(&psc->ccr); ccr &= 0xFF000000; ccr &= 0xFF000000; if (cs->speed_hz) speed = cs->speed_hz; bclkdiv = (mps->mclk / cs->speed_hz) - 1; if (!speed) else speed = 1000000; /* default 1MHz */ bclkdiv = (mps->mclk / 1000000) - 1; /* default 1MHz */ bclkdiv = (mps->mclk_rate / speed) - 1; ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8)); ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8)); out_be32(&psc->ccr, ccr); out_be32(&psc->ccr, ccr); Loading Loading @@ -386,19 +388,11 @@ static int mpc512x_psc_spi_port_config(struct spi_master *master, { { struct mpc52xx_psc __iomem *psc = mps->psc; struct mpc52xx_psc __iomem *psc = mps->psc; struct mpc512x_psc_fifo __iomem *fifo = mps->fifo; struct mpc512x_psc_fifo __iomem *fifo = mps->fifo; struct clk *spiclk; int ret = 0; char name[32]; u32 sicr; u32 sicr; u32 ccr; u32 ccr; int speed; u16 bclkdiv; u16 bclkdiv; sprintf(name, "psc%d_mclk", master->bus_num); spiclk = clk_get(&master->dev, name); clk_enable(spiclk); mps->mclk = clk_get_rate(spiclk); clk_put(spiclk); /* Reset the PSC into a known state */ /* Reset the PSC into a known state */ out_8(&psc->command, MPC52xx_PSC_RST_RX); out_8(&psc->command, MPC52xx_PSC_RST_RX); out_8(&psc->command, MPC52xx_PSC_RST_TX); out_8(&psc->command, MPC52xx_PSC_RST_TX); Loading @@ -425,7 +419,8 @@ static int mpc512x_psc_spi_port_config(struct spi_master *master, ccr = in_be32(&psc->ccr); ccr = in_be32(&psc->ccr); ccr &= 0xFF000000; ccr &= 0xFF000000; bclkdiv = (mps->mclk / 1000000) - 1; /* default 1MHz */ speed = 1000000; /* default 1MHz */ bclkdiv = (mps->mclk_rate / speed) - 1; ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8)); ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8)); out_be32(&psc->ccr, ccr); out_be32(&psc->ccr, ccr); Loading @@ -445,7 +440,7 @@ static int mpc512x_psc_spi_port_config(struct spi_master *master, mps->bits_per_word = 8; mps->bits_per_word = 8; return ret; return 0; } } static irqreturn_t mpc512x_psc_spi_isr(int irq, void *dev_id) static irqreturn_t mpc512x_psc_spi_isr(int irq, void *dev_id) Loading Loading @@ -479,6 +474,9 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr, struct spi_master *master; struct spi_master *master; int ret; int ret; void *tempp; void *tempp; int psc_num; char clk_name[16]; struct clk *clk; master = spi_alloc_master(dev, sizeof *mps); master = spi_alloc_master(dev, sizeof *mps); if (master == NULL) if (master == NULL) Loading Loading @@ -521,16 +519,29 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr, goto free_master; goto free_master; init_completion(&mps->txisrdone); init_completion(&mps->txisrdone); psc_num = master->bus_num; snprintf(clk_name, sizeof(clk_name), "psc%d_mclk", psc_num); clk = devm_clk_get(dev, clk_name); if (IS_ERR(clk)) goto free_irq; ret = clk_prepare_enable(clk); if (ret) goto free_irq; mps->clk_mclk = clk; mps->mclk_rate = clk_get_rate(clk); ret = mpc512x_psc_spi_port_config(master, mps); ret = mpc512x_psc_spi_port_config(master, mps); if (ret < 0) if (ret < 0) goto free_irq; goto free_clock; ret = spi_register_master(master); ret = spi_register_master(master); if (ret < 0) if (ret < 0) goto free_irq; goto free_clock; return ret; return ret; free_clock: clk_disable_unprepare(mps->clk_mclk); free_irq: free_irq: free_irq(mps->irq, mps); free_irq(mps->irq, mps); free_master: free_master: Loading @@ -547,6 +558,7 @@ static int mpc512x_psc_spi_do_remove(struct device *dev) struct mpc512x_psc_spi *mps = spi_master_get_devdata(master); struct mpc512x_psc_spi *mps = spi_master_get_devdata(master); spi_unregister_master(master); spi_unregister_master(master); clk_disable_unprepare(mps->clk_mclk); free_irq(mps->irq, mps); free_irq(mps->irq, mps); if (mps->psc) if (mps->psc) iounmap(mps->psc); iounmap(mps->psc); Loading Loading
drivers/spi/spi-mpc512x-psc.c +30 −18 Original line number Original line Diff line number Diff line Loading @@ -38,7 +38,8 @@ struct mpc512x_psc_spi { struct mpc512x_psc_fifo __iomem *fifo; struct mpc512x_psc_fifo __iomem *fifo; unsigned int irq; unsigned int irq; u8 bits_per_word; u8 bits_per_word; u32 mclk; struct clk *clk_mclk; u32 mclk_rate; struct completion txisrdone; struct completion txisrdone; }; }; Loading Loading @@ -72,6 +73,7 @@ static void mpc512x_psc_spi_activate_cs(struct spi_device *spi) struct mpc52xx_psc __iomem *psc = mps->psc; struct mpc52xx_psc __iomem *psc = mps->psc; u32 sicr; u32 sicr; u32 ccr; u32 ccr; int speed; u16 bclkdiv; u16 bclkdiv; sicr = in_be32(&psc->sicr); sicr = in_be32(&psc->sicr); Loading @@ -95,10 +97,10 @@ static void mpc512x_psc_spi_activate_cs(struct spi_device *spi) ccr = in_be32(&psc->ccr); ccr = in_be32(&psc->ccr); ccr &= 0xFF000000; ccr &= 0xFF000000; if (cs->speed_hz) speed = cs->speed_hz; bclkdiv = (mps->mclk / cs->speed_hz) - 1; if (!speed) else speed = 1000000; /* default 1MHz */ bclkdiv = (mps->mclk / 1000000) - 1; /* default 1MHz */ bclkdiv = (mps->mclk_rate / speed) - 1; ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8)); ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8)); out_be32(&psc->ccr, ccr); out_be32(&psc->ccr, ccr); Loading Loading @@ -386,19 +388,11 @@ static int mpc512x_psc_spi_port_config(struct spi_master *master, { { struct mpc52xx_psc __iomem *psc = mps->psc; struct mpc52xx_psc __iomem *psc = mps->psc; struct mpc512x_psc_fifo __iomem *fifo = mps->fifo; struct mpc512x_psc_fifo __iomem *fifo = mps->fifo; struct clk *spiclk; int ret = 0; char name[32]; u32 sicr; u32 sicr; u32 ccr; u32 ccr; int speed; u16 bclkdiv; u16 bclkdiv; sprintf(name, "psc%d_mclk", master->bus_num); spiclk = clk_get(&master->dev, name); clk_enable(spiclk); mps->mclk = clk_get_rate(spiclk); clk_put(spiclk); /* Reset the PSC into a known state */ /* Reset the PSC into a known state */ out_8(&psc->command, MPC52xx_PSC_RST_RX); out_8(&psc->command, MPC52xx_PSC_RST_RX); out_8(&psc->command, MPC52xx_PSC_RST_TX); out_8(&psc->command, MPC52xx_PSC_RST_TX); Loading @@ -425,7 +419,8 @@ static int mpc512x_psc_spi_port_config(struct spi_master *master, ccr = in_be32(&psc->ccr); ccr = in_be32(&psc->ccr); ccr &= 0xFF000000; ccr &= 0xFF000000; bclkdiv = (mps->mclk / 1000000) - 1; /* default 1MHz */ speed = 1000000; /* default 1MHz */ bclkdiv = (mps->mclk_rate / speed) - 1; ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8)); ccr |= (((bclkdiv & 0xff) << 16) | (((bclkdiv >> 8) & 0xff) << 8)); out_be32(&psc->ccr, ccr); out_be32(&psc->ccr, ccr); Loading @@ -445,7 +440,7 @@ static int mpc512x_psc_spi_port_config(struct spi_master *master, mps->bits_per_word = 8; mps->bits_per_word = 8; return ret; return 0; } } static irqreturn_t mpc512x_psc_spi_isr(int irq, void *dev_id) static irqreturn_t mpc512x_psc_spi_isr(int irq, void *dev_id) Loading Loading @@ -479,6 +474,9 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr, struct spi_master *master; struct spi_master *master; int ret; int ret; void *tempp; void *tempp; int psc_num; char clk_name[16]; struct clk *clk; master = spi_alloc_master(dev, sizeof *mps); master = spi_alloc_master(dev, sizeof *mps); if (master == NULL) if (master == NULL) Loading Loading @@ -521,16 +519,29 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr, goto free_master; goto free_master; init_completion(&mps->txisrdone); init_completion(&mps->txisrdone); psc_num = master->bus_num; snprintf(clk_name, sizeof(clk_name), "psc%d_mclk", psc_num); clk = devm_clk_get(dev, clk_name); if (IS_ERR(clk)) goto free_irq; ret = clk_prepare_enable(clk); if (ret) goto free_irq; mps->clk_mclk = clk; mps->mclk_rate = clk_get_rate(clk); ret = mpc512x_psc_spi_port_config(master, mps); ret = mpc512x_psc_spi_port_config(master, mps); if (ret < 0) if (ret < 0) goto free_irq; goto free_clock; ret = spi_register_master(master); ret = spi_register_master(master); if (ret < 0) if (ret < 0) goto free_irq; goto free_clock; return ret; return ret; free_clock: clk_disable_unprepare(mps->clk_mclk); free_irq: free_irq: free_irq(mps->irq, mps); free_irq(mps->irq, mps); free_master: free_master: Loading @@ -547,6 +558,7 @@ static int mpc512x_psc_spi_do_remove(struct device *dev) struct mpc512x_psc_spi *mps = spi_master_get_devdata(master); struct mpc512x_psc_spi *mps = spi_master_get_devdata(master); spi_unregister_master(master); spi_unregister_master(master); clk_disable_unprepare(mps->clk_mclk); free_irq(mps->irq, mps); free_irq(mps->irq, mps); if (mps->psc) if (mps->psc) iounmap(mps->psc); iounmap(mps->psc); Loading