Skip to contentSkip to conversation

AHCI and SATA PHY support for Broadcom STB SoCs

PATCH Applied Brian Norris 5 participants 29 messages May 12, 2015 – May 25, 2015

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

v3 cover AHCI and SATA PHY support for Broadcom STB SoCs

Few changes since v2, and the changes are *only* to the SATA driver, not to any of the DT bindings or the PHY driver. I'm resending the whole series for completeness.

I'll list the changelog in each patch, but in summary:

v2 -> v3:
- straighten out endianness for big endian MIPS and ARM in AHCI driver
- rename sata_brcmstb.c to ahci_brcmstb.c
- bind ahci_brcmstb.c against the specific string, "brcm,bcm7445-ahci" instead of the generic one

Brian

Brian Norris (5):
Documentation: devicetree: add Broadcom SATA binding
Documentation: devicetree: add Broadcom SATA PHY binding
ata: add Broadcom AHCI SATA3 driver for STB chips
phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs
ARM: dts: brcmstb: add nodes for SATA controller and PHY

 .../devicetree/bindings/ata/brcm,sata-brcmstb.txt  |  35 +++
 .../bindings/phy/brcm,brcmstb-sata-phy.txt         |  40 +++
 arch/arm/boot/dts/bcm7445.dtsi                     |  37 +++
 drivers/ata/Kconfig                                |   9 +
 drivers/ata/Makefile                               |   1 +
 drivers/ata/ahci_brcmstb.c                         | 322 +++++++++++++++++++++
 drivers/phy/Kconfig                                |   9 +
 drivers/phy/Makefile                               |   1 +
 drivers/phy/phy-brcmstb-sata.c                     | 216 ++++++++++++++
 9 files changed, 670 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/ata/brcm,sata-brcmstb.txt
 create mode 100644 Documentation/devicetree/bindings/phy/brcm,brcmstb-sata-phy.txt
 create mode 100644 drivers/ata/ahci_brcmstb.c
 create mode 100644 drivers/phy/phy-brcmstb-sata.c
Signature · 1 line
1.9.1
#1 lore raw

PATCH v3 1/5 Documentation: devicetree: add Broadcom SATA binding

---
v3: no change
v2: no change

 .../devicetree/bindings/ata/brcm,sata-brcmstb.txt  | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/ata/brcm,sata-brcmstb.txt
Documentation/devicetree/bindings/ata/brcm,sata-brcmstb.txt new file +35 -0
new file mode 100644
index 000000000000..afeede13e195
@@ -0,0 +1,35 @@
+* Broadcom SATA3 AHCI Controller for STB
+
+SATA nodes are defined to describe on-chip Serial ATA controllers.
+Each SATA controller should have its own node.
+
+Required properties:
+- compatible         : compatible list, may contain "brcm,bcm7445-ahci" and/or
+                       "brcm,sata3-ahci"
+- reg                : register mappings for AHCI and SATA_TOP_CTRL
+- reg-names          : "ahci" and "top-ctrl"
+- interrupts         : interrupt mapping for SATA IRQ
+
+Also see ahci-platform.txt.
+
+Example:
+
+	sata at f045a000 {
+		compatible = "brcm,bcm7445-ahci", "brcm,sata3-ahci";
+		reg = <0xf045a000 0xa9c>, <0xf0458040 0x24>;
+		reg-names = "ahci", "top-ctrl";
+		interrupts = <0 30 0>;
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		sata0: sata-port at 0 {
+			reg = <0>;
+			phys = <&sata_phy 0>;
+		};
+
+		sata1: sata-port at 1 {
+			reg = <1>;
+			phys = <&sata_phy 1>;
+		};
+	};
+
Signature · 1 line
1.9.1
Applied
#2 lore raw

Re: [PATCH v3 1/5] Documentation: devicetree: add Broadcom SATA binding

Quoted 1 line · Brian Norris

Applied to libata/for-4.2.

Thanks.

Signature · 1 line
tejun
#3 lore raw

PATCH v3 2/5 Documentation: devicetree: add Broadcom SATA PHY binding

In reply to Brian Norris

For 28nm STB chips, based on BCM7445.

---
v3: no change

v2:
- make each subnode into a provider, so we can use direct phandle references to them
- drop the 'port-ctrl' register range, since this was shared with the SATA node

 .../bindings/phy/brcm,brcmstb-sata-phy.txt         | 40 ++++++++++++++++++++++
 1 file changed, 40 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/phy/brcm,brcmstb-sata-phy.txt
Documentation/devicetree/bindings/phy/brcm,brcmstb-sata-phy.txt new file +40 -0
new file mode 100644
index 000000000000..7f81ef90146a
@@ -0,0 +1,40 @@
+* Broadcom SATA3 PHY for STB
+
+Required properties:
+- compatible: should be one or more of
+     "brcm,bcm7445-sata-phy"
+     "brcm,phy-sata3"
+- address-cells: should be 1
+- size-cells: should be 0
+- reg: register range for the PHY PCB interface
+- reg-names: should be "phy"
+
+Sub-nodes:
+  Each port's PHY should be represented as a sub-node.
+
+Sub-nodes required properties:
+- reg: the PHY number
+- phy-cells: generic PHY binding; must be 0
+Optional:
+- brcm,enable-ssc: use spread spectrum clocking (SSC) on this port
+
+
+Example:
+
+	sata-phy at f0458100 {
+		compatible = "brcm,bcm7445-sata-phy", "brcm,phy-sata3";
+		reg = <0xf0458100 0x1e00>, <0xf045804c 0x10>;
+		reg-names = "phy";
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		sata-phy at 0 {
+			reg = <0>;
+			#phy-cells = <0>;
+		};
+
+		sata-phy at 1 {
+			reg = <1>;
+			#phy-cells = <0>;
+		};
+	};
Signature · 1 line
1.9.1
#4 lore raw

PATCH v3 3/5 ata: add Broadcom AHCI SATA3 driver for STB chips

In reply to Brian Norris

Pretty straightforward driver, using the nice library-ization of the generic ahci_platform driver.

---
v3:
- straighten out endianness for big endian MIPS and ARM
- rename from sata_brcmstb.c to ahci_brcmstb.c
- bind against the specific string, "brcm,bcm7445-ahci" instead of the generic one

v2:
- move port enabling into this driver, since the affected registers are in the SATA_TOP_CTRL block. This means we need to check for the implemented port(s) here.

- fix up layering issues with using drvdata (libata expects to use drvdata), similar to this issue:

http://marc.info/?l=linux-ide&m=142851961920009&w=2

- trivial fixups

 drivers/ata/Kconfig        |   9 ++
 drivers/ata/Makefile       |   1 +
 drivers/ata/ahci_brcmstb.c | 322 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 332 insertions(+)
 create mode 100644 drivers/ata/ahci_brcmstb.c
drivers/ata/Kconfig +9 -0
index 5f601553b9b0..dfb273a1194b 100644
@@ -98,6 +98,15 @@ config SATA_AHCI_PLATFORM
 
 	  If unsure, say N.
 
+config AHCI_BRCMSTB
+	tristate "Broadcom STB AHCI SATA support"
+	depends on ARCH_BRCMSTB
+	help
+	  This option enables support for the AHCI SATA3 controller found on
+	  STB SoC's.
+
+	  If unsure, say N.
+
 config AHCI_DA850
 	tristate "DaVinci DA850 AHCI SATA support"
 	depends on ARCH_DAVINCI_DA850
drivers/ata/Makefile +1 -0
index b67e995179a9..b95449184ae1 100644
@@ -10,6 +10,7 @@ obj-$(CONFIG_SATA_INIC162X)	+= sata_inic162x.o
 obj-$(CONFIG_SATA_SIL24)	+= sata_sil24.o
 obj-$(CONFIG_SATA_DWC)		+= sata_dwc_460ex.o
 obj-$(CONFIG_SATA_HIGHBANK)	+= sata_highbank.o libahci.o
+obj-$(CONFIG_AHCI_BRCMSTB)	+= ahci_brcmstb.o libahci.o libahci_platform.o
 obj-$(CONFIG_AHCI_DA850)	+= ahci_da850.o libahci.o libahci_platform.o
 obj-$(CONFIG_AHCI_IMX)		+= ahci_imx.o libahci.o libahci_platform.o
 obj-$(CONFIG_AHCI_MVEBU)	+= ahci_mvebu.o libahci.o libahci_platform.o
drivers/ata/ahci_brcmstb.c new file +322 -0

322 lines not on this page · raw message

Signature · 1 line
1.9.1
Applied
#5 lore raw

Re: [PATCH v3 3/5] ata: add Broadcom AHCI SATA3 driver for STB chips

Quoted 4 lines · Brian Norris

Pretty straightforward driver, using the nice library-ization of the generic ahci_platform driver.

Applied to libata/for-4.2.

Hans, if you see any issues, please let me know.

Thanks.

Signature · 1 line
tejun
#6 lore raw

Re: [PATCH v3 3/5] ata: add Broadcom AHCI SATA3 driver for STB chips

In reply to Brian Norris

drivers/ata/ahci_brcmstb.c line 189

Quoted 4 lines · Brian Norris
drivers/ata/ahci_brcmstb.c new file +4 -0
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ahci");
+       ahci = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(ahci))
+               return 0;

You should propagate 'return PTR_ERR(ahci)' instead.

#7 lore raw

Re: [PATCH v3 3/5] ata: add Broadcom AHCI SATA3 driver for STB chips

Quoted 9 lines · Fabio Estevam

drivers/ata/ahci_brcmstb.c line 189

Quoted 4 lines · Brian Norris
drivers/ata/ahci_brcmstb.c new file +4 -0
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ahci");
+       ahci = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(ahci))
+               return 0;

You should propagate 'return PTR_ERR(ahci)' instead.

Brian, can you please update the patch?

Thanks.

Signature · 1 line
tejun
#8 lore raw

Re: [PATCH v3 3/5] ata: add Broadcom AHCI SATA3 driver for STB chips

Quoted 4 lines · Tejun Heo
Quoted 3 lines · Fabio Estevam

On Tue, May 12, 2015 at 8:28 PM, Brian Norris
<[email protected]> wrote:

Quoted 8 lines
Quoted 6 lines

drivers/ata/ahci_brcmstb.c line 189

Quoted 4 lines
drivers/ata/ahci_brcmstb.c new file +4 -0
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ahci");
+       ahci = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(ahci))
+               return 0;

You should propagate 'return PTR_ERR(ahci)' instead.

Brian, can you please update the patch?

Note how the function brcm_ahci_get_portmask() is used. In brcm_ahci_probe():

        priv->port_mask = brcm_ahci_get_portmask(pdev, priv);
        if (!priv->port_mask)
                return -ENODEV;

I could try to change the return semantics if really needed. Or I could add some comments on brcm_ahci_get_portmask() to note its return semantics. Or I could just leave the driver as-is. Your call.

Brian

#9 lore raw

Re: [PATCH v3 3/5] ata: add Broadcom AHCI SATA3 driver for STB chips

Quoted 16 lines · Brian Norris
Quoted 4 lines · Tejun Heo
Quoted 3 lines · Fabio Estevam

On Tue, May 12, 2015 at 8:28 PM, Brian Norris
<[email protected]> wrote:

Quoted 8 lines
Quoted 6 lines

drivers/ata/ahci_brcmstb.c line 189

Quoted 4 lines
drivers/ata/ahci_brcmstb.c new file +4 -0
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ahci");
+       ahci = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(ahci))
+               return 0;

You should propagate 'return PTR_ERR(ahci)' instead.

Brian, can you please update the patch?

Note how the function brcm_ahci_get_portmask() is used. In brcm_ahci_probe():

Quoted 7 lines
        priv->port_mask = brcm_ahci_get_portmask(pdev, priv);
        if (!priv->port_mask)
                return -ENODEV;

I could try to change the return semantics if really needed. Or I could add some comments on brcm_ahci_get_portmask() to note its return semantics. Or I could just leave the driver as-is. Your call.

Ah, you're right. It's fine. Leave it alone.

Thanks.

Signature · 1 line
tejun
#10 lore raw

PATCH v3 4/5 phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs

In reply to Brian Norris

Supports up to two ports which can each be powered on/off and configured independently.

---
v3: no change

v2:
- stop sharing SATA_TOP_CTRL registers with SATA driver
- kill custom xlate function

 drivers/phy/Kconfig            |   9 ++
 drivers/phy/Makefile           |   1 +
 drivers/phy/phy-brcmstb-sata.c | 216 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 226 insertions(+)
 create mode 100644 drivers/phy/phy-brcmstb-sata.c
drivers/phy/Kconfig +9 -0
index a53bd5b52df9..36788b6f0220 100644
@@ -309,4 +309,13 @@ config PHY_QCOM_UFS
 	help
 	  Support for UFS PHY on QCOM chipsets.
 
+config PHY_BRCMSTB_SATA
+	tristate "Broadcom STB SATA PHY driver"
+	depends on ARCH_BRCMSTB
+	depends on OF
+	select GENERIC_PHY
+	help
+	  Enable this to support the SATA3 PHY on 28nm Broadcom STB SoCs.
+	  Likely useful only with CONFIG_SATA_BRCMSTB enabled.
+
 endmenu
drivers/phy/Makefile +1 -0
index f12625178780..c61f3fdd191e 100644
@@ -40,3 +40,4 @@ obj-$(CONFIG_PHY_STIH41X_USB)		+= phy-stih41x-usb.o
 obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs.o
 obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-20nm.o
 obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-14nm.o
+obj-$(CONFIG_PHY_BRCMSTB_SATA)		+= phy-brcmstb-sata.o
drivers/phy/phy-brcmstb-sata.c new file +216 -0

216 lines not on this page · raw message

Signature · 1 line
1.9.1
#11 lore raw

Re: [PATCH v3 4/5] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs

Hi,

Quoted 4 lines · Brian Norris

Supports up to two ports which can each be powered on/off and configured independently.

couple of minor comments below

Quoted 87 lines

---
v3: no change

v2:
- stop sharing SATA_TOP_CTRL registers with SATA driver
- kill custom xlate function

  drivers/phy/Kconfig            |   9 ++
  drivers/phy/Makefile           |   1 +
  drivers/phy/phy-brcmstb-sata.c | 216 +++++++++++++++++++++++++++++++++++++++++
  3 files changed, 226 insertions(+)

create mode 100644 drivers/phy/phy-brcmstb-sata.c

drivers/phy/Kconfig +9 -0
index a53bd5b52df9..36788b6f0220 100644
@@ -309,4 +309,13 @@ config PHY_QCOM_UFS
  	help
  	  Support for UFS PHY on QCOM chipsets.
 
+config PHY_BRCMSTB_SATA
+	tristate "Broadcom STB SATA PHY driver"
+	depends on ARCH_BRCMSTB
+	depends on OF
+	select GENERIC_PHY
+	help
+	  Enable this to support the SATA3 PHY on 28nm Broadcom STB SoCs.
+	  Likely useful only with CONFIG_SATA_BRCMSTB enabled.
+
  endmenu
drivers/phy/Makefile +1 -0
index f12625178780..c61f3fdd191e 100644
@@ -40,3 +40,4 @@ obj-$(CONFIG_PHY_STIH41X_USB)		+= phy-stih41x-usb.o
  obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs.o
  obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-20nm.o
  obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-14nm.o
+obj-$(CONFIG_PHY_BRCMSTB_SATA)		+= phy-brcmstb-sata.o
drivers/phy/phy-brcmstb-sata.c new file +41 -0
new file mode 100644
index 000000000000..8387c8cbea8c
@@ -0,0 +1,216 @@
+/*
+ * Broadcom SATA3 AHCI Controller PHY Driver
+ *
+ * Copyright ? 2009-2015 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+
+#define SATA_MDIO_BANK_OFFSET				0x23c
+#define SATA_MDIO_REG_OFFSET(ofs)			((ofs) * 4)
+#define SATA_MDIO_REG_SPACE_SIZE			0x1000
+#define SATA_MDIO_REG_LENGTH				0x1f00
+
+#define MAX_PORTS					2
+
+/* Register offset between PHYs in PCB space */
+#define SATA_MDIO_REG_SPACE_SIZE			0x1000
+
+struct brcm_sata_port {
+	int portnum;
+	struct phy *phy;
+	struct brcm_sata_phy *phy_priv;
+	bool ssc_en;

drivers/phy/phy-brcmstb-sata.c line 51

Quoted 10 lines
drivers/phy/phy-brcmstb-sata.c new file +10 -0
+};
+
+struct brcm_sata_phy {
+	struct device *dev;
+	void __iomem *phy_base;
+
+	struct brcm_sata_port phys[MAX_PORTS];
+};
+
+enum sata_mdio_phy_regs_28nm {

Why should these defines be in enum?

Quoted 28 lines
drivers/phy/phy-brcmstb-sata.c new file +28 -0
+	PLL_REG_BANK_0				= 0x50,
+	PLL_REG_BANK_0_PLLCONTROL_0		= 0x81,
+
+	TXPMD_REG_BANK				= 0x1a0,
+	TXPMD_CONTROL1				= 0x81,
+	TXPMD_CONTROL1_TX_SSC_EN_FRC		= BIT(0),
+	TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL	= BIT(1),
+	TXPMD_TX_FREQ_CTRL_CONTROL1		= 0x82,
+	TXPMD_TX_FREQ_CTRL_CONTROL2		= 0x83,
+	TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK	= 0x3ff,
+	TXPMD_TX_FREQ_CTRL_CONTROL3		= 0x84,
+	TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK	= 0x3ff,
+};
+
+static inline void __iomem *brcm_sata_phy_base(struct brcm_sata_port *port)
+{
+	struct brcm_sata_phy *priv = port->phy_priv;
+
+	return priv->phy_base + (port->portnum * SATA_MDIO_REG_SPACE_SIZE);
+}
+
+static void brcm_sata_mdio_wr(void __iomem *addr, u32 bank, u32 ofs,
+			      u32 msk, u32 value)
+{
+	u32 tmp;
+
+	writel(bank, addr + SATA_MDIO_BANK_OFFSET);
+	tmp = readl(addr + SATA_MDIO_REG_OFFSET(ofs));

drivers/phy/phy-brcmstb-sata.c line 89

Quoted 10 lines
drivers/phy/phy-brcmstb-sata.c new file +10 -0
+	tmp = (tmp & msk) | value;
+	writel(tmp, addr + SATA_MDIO_REG_OFFSET(ofs));
+}
+
+/* These defaults were characterized by H/W group */
+#define FMIN_VAL_DEFAULT	0x3df
+#define FMAX_VAL_DEFAULT	0x3df
+#define FMAX_VAL_SSC		0x83
+
+static void cfg_ssc_28nm(struct brcm_sata_port *port)

brcm_sata_cfg_ssc_28nm to make it similar to other functions.

Quoted 99 lines
drivers/phy/phy-brcmstb-sata.c new file +99 -0
+{
+	void __iomem *base = brcm_sata_phy_base(port);
+	struct brcm_sata_phy *priv = port->phy_priv;
+	u32 tmp;
+
+	/* override the TX spread spectrum setting */
+	tmp = TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL | TXPMD_CONTROL1_TX_SSC_EN_FRC;
+	brcm_sata_mdio_wr(base, TXPMD_REG_BANK, TXPMD_CONTROL1, ~tmp, tmp);
+
+	/* set fixed min freq */
+	brcm_sata_mdio_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL2,
+			  ~TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK,
+			  FMIN_VAL_DEFAULT);
+
+	/* set fixed max freq depending on SSC config */
+	if (port->ssc_en) {
+		dev_info(priv->dev, "enabling SSC on port %d\n", port->portnum);
+		tmp = FMAX_VAL_SSC;
+	} else {
+		tmp = FMAX_VAL_DEFAULT;
+	}
+
+	brcm_sata_mdio_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL3,
+			  ~TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK, tmp);
+}
+
+static int brcm_sata_phy_init(struct phy *phy)
+{
+	struct brcm_sata_port *port = phy_get_drvdata(phy);
+
+	cfg_ssc_28nm(port);
+
+	return 0;
+}
+
+static struct phy_ops phy_ops_28nm = {
+	.init		= brcm_sata_phy_init,
+	.owner		= THIS_MODULE,
+};
+
+static const struct of_device_id brcm_sata_phy_of_match[] = {
+	{ .compatible	= "brcm,bcm7445-sata-phy" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match);
+
+static int brcm_sata_phy_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device_node *dn = dev->of_node, *child;
+	struct brcm_sata_phy *priv;
+	struct resource *res;
+	struct phy_provider *provider;
+	int count = 0;
+
+	if (of_get_child_count(dn) == 0)
+		return -ENODEV;
+
+	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+	dev_set_drvdata(dev, priv);
+	priv->dev = dev;
+
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy");
+	priv->phy_base = devm_ioremap_resource(dev, res);
+	if (IS_ERR(priv->phy_base))
+		return PTR_ERR(priv->phy_base);
+
+	for_each_available_child_of_node(dn, child) {
+		unsigned int id;
+		struct brcm_sata_port *port;
+
+		if (of_property_read_u32(child, "reg", &id)) {
+			dev_err(dev, "missing reg property in node %s\n",
+					child->name);
+			return -EINVAL;
+		}
+
+		if (id >= MAX_PORTS) {
+			dev_err(dev, "invalid reg: %u\n", id);
+			return -EINVAL;
+		}
+		if (priv->phys[id].phy) {
+			dev_err(dev, "already registered port %u\n", id);
+			return -EINVAL;
+		}
+
+		port = &priv->phys[id];
+		port->portnum = id;
+		port->phy_priv = priv;
+		port->phy = devm_phy_create(dev, child, &phy_ops_28nm);
+		port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc");
+		if (IS_ERR(port->phy)) {
+			dev_err(dev, "failed to create PHY\n");
+			return PTR_ERR(port->phy);
+		}
+
+		phy_set_drvdata(port->phy, port);

drivers/phy/phy-brcmstb-sata.c line 198

Quoted 10 lines
drivers/phy/phy-brcmstb-sata.c new file +10 -0
+		count++;
+	}
+
+	provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
+	if (IS_ERR(provider)) {
+		dev_err(dev, "could not register PHY provider\n");
+		return PTR_ERR(provider);
+	}
+
+	dev_info(dev, "registered %d port(s)\n", count);

lets not make the boot noisy. Change to dev_dbg?

Thanks
Kishon

#12 lore raw

Re: [PATCH v3 4/5] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs

Quoted 100 lines · Kishon Vijay Abraham I

Hi,

Quoted 4 lines · Brian Norris

Supports up to two ports which can each be powered on/off and configured independently.

couple of minor comments below

Quoted 91 lines

---
v3: no change

v2:
- stop sharing SATA_TOP_CTRL registers with SATA driver
- kill custom xlate function

 drivers/phy/Kconfig            |   9 ++
 drivers/phy/Makefile           |   1 +
 drivers/phy/phy-brcmstb-sata.c | 216 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 226 insertions(+)
 create mode 100644 drivers/phy/phy-brcmstb-sata.c
drivers/phy/Kconfig +9 -0
index a53bd5b52df9..36788b6f0220 100644
@@ -309,4 +309,13 @@ config PHY_QCOM_UFS
 	help
 	  Support for UFS PHY on QCOM chipsets.
 
+config PHY_BRCMSTB_SATA
+	tristate "Broadcom STB SATA PHY driver"
+	depends on ARCH_BRCMSTB
+	depends on OF
+	select GENERIC_PHY
+	help
+	  Enable this to support the SATA3 PHY on 28nm Broadcom STB SoCs.
+	  Likely useful only with CONFIG_SATA_BRCMSTB enabled.
+
 endmenu
drivers/phy/Makefile +1 -0
index f12625178780..c61f3fdd191e 100644
@@ -40,3 +40,4 @@ obj-$(CONFIG_PHY_STIH41X_USB)		+= phy-stih41x-usb.o
 obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs.o
 obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-20nm.o
 obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-14nm.o
+obj-$(CONFIG_PHY_BRCMSTB_SATA)		+= phy-brcmstb-sata.o
drivers/phy/phy-brcmstb-sata.c new file +45 -0
new file mode 100644
index 000000000000..8387c8cbea8c
@@ -0,0 +1,216 @@
+/*
+ * Broadcom SATA3 AHCI Controller PHY Driver
+ *
+ * Copyright ? 2009-2015 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+
+#define SATA_MDIO_BANK_OFFSET				0x23c
+#define SATA_MDIO_REG_OFFSET(ofs)			((ofs) * 4)
+#define SATA_MDIO_REG_SPACE_SIZE			0x1000
+#define SATA_MDIO_REG_LENGTH				0x1f00
+
+#define MAX_PORTS					2
+
+/* Register offset between PHYs in PCB space */
+#define SATA_MDIO_REG_SPACE_SIZE			0x1000
+
+struct brcm_sata_port {
+	int portnum;
+	struct phy *phy;
+	struct brcm_sata_phy *phy_priv;
+	bool ssc_en;
+};
+
+struct brcm_sata_phy {
+	struct device *dev;
Quoted 8 lines

drivers/phy/phy-brcmstb-sata.c line 51

Quoted 6 lines
drivers/phy/phy-brcmstb-sata.c new file +6 -0
+	void __iomem *phy_base;
+
+	struct brcm_sata_port phys[MAX_PORTS];
+};
+
+enum sata_mdio_phy_regs_28nm {

Why should these defines be in enum?

Why not? They're logically grouped this way, and IMO, they look nicer. You can see drivers/ata/ahci.h for a similar example.

Quoted 32 lines
Quoted 32 lines
drivers/phy/phy-brcmstb-sata.c new file +32 -0
+	PLL_REG_BANK_0				= 0x50,
+	PLL_REG_BANK_0_PLLCONTROL_0		= 0x81,
+
+	TXPMD_REG_BANK				= 0x1a0,
+	TXPMD_CONTROL1				= 0x81,
+	TXPMD_CONTROL1_TX_SSC_EN_FRC		= BIT(0),
+	TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL	= BIT(1),
+	TXPMD_TX_FREQ_CTRL_CONTROL1		= 0x82,
+	TXPMD_TX_FREQ_CTRL_CONTROL2		= 0x83,
+	TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK	= 0x3ff,
+	TXPMD_TX_FREQ_CTRL_CONTROL3		= 0x84,
+	TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK	= 0x3ff,
+};
+
+static inline void __iomem *brcm_sata_phy_base(struct brcm_sata_port *port)
+{
+	struct brcm_sata_phy *priv = port->phy_priv;
+
+	return priv->phy_base + (port->portnum * SATA_MDIO_REG_SPACE_SIZE);
+}
+
+static void brcm_sata_mdio_wr(void __iomem *addr, u32 bank, u32 ofs,
+			      u32 msk, u32 value)
+{
+	u32 tmp;
+
+	writel(bank, addr + SATA_MDIO_BANK_OFFSET);
+	tmp = readl(addr + SATA_MDIO_REG_OFFSET(ofs));
+	tmp = (tmp & msk) | value;
+	writel(tmp, addr + SATA_MDIO_REG_OFFSET(ofs));
+}
+
Quoted 8 lines

drivers/phy/phy-brcmstb-sata.c line 89

Quoted 6 lines
drivers/phy/phy-brcmstb-sata.c new file +6 -0
+/* These defaults were characterized by H/W group */
+#define FMIN_VAL_DEFAULT	0x3df
+#define FMAX_VAL_DEFAULT	0x3df
+#define FMAX_VAL_SSC		0x83
+
+static void cfg_ssc_28nm(struct brcm_sata_port *port)

brcm_sata_cfg_ssc_28nm to make it similar to other functions.

OK.

Quoted 103 lines
Quoted 103 lines
drivers/phy/phy-brcmstb-sata.c new file +103 -0
+{
+	void __iomem *base = brcm_sata_phy_base(port);
+	struct brcm_sata_phy *priv = port->phy_priv;
+	u32 tmp;
+
+	/* override the TX spread spectrum setting */
+	tmp = TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL | TXPMD_CONTROL1_TX_SSC_EN_FRC;
+	brcm_sata_mdio_wr(base, TXPMD_REG_BANK, TXPMD_CONTROL1, ~tmp, tmp);
+
+	/* set fixed min freq */
+	brcm_sata_mdio_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL2,
+			  ~TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK,
+			  FMIN_VAL_DEFAULT);
+
+	/* set fixed max freq depending on SSC config */
+	if (port->ssc_en) {
+		dev_info(priv->dev, "enabling SSC on port %d\n", port->portnum);
+		tmp = FMAX_VAL_SSC;
+	} else {
+		tmp = FMAX_VAL_DEFAULT;
+	}
+
+	brcm_sata_mdio_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL3,
+			  ~TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK, tmp);
+}
+
+static int brcm_sata_phy_init(struct phy *phy)
+{
+	struct brcm_sata_port *port = phy_get_drvdata(phy);
+
+	cfg_ssc_28nm(port);
+
+	return 0;
+}
+
+static struct phy_ops phy_ops_28nm = {
+	.init		= brcm_sata_phy_init,
+	.owner		= THIS_MODULE,
+};
+
+static const struct of_device_id brcm_sata_phy_of_match[] = {
+	{ .compatible	= "brcm,bcm7445-sata-phy" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match);
+
+static int brcm_sata_phy_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device_node *dn = dev->of_node, *child;
+	struct brcm_sata_phy *priv;
+	struct resource *res;
+	struct phy_provider *provider;
+	int count = 0;
+
+	if (of_get_child_count(dn) == 0)
+		return -ENODEV;
+
+	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+	dev_set_drvdata(dev, priv);
+	priv->dev = dev;
+
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy");
+	priv->phy_base = devm_ioremap_resource(dev, res);
+	if (IS_ERR(priv->phy_base))
+		return PTR_ERR(priv->phy_base);
+
+	for_each_available_child_of_node(dn, child) {
+		unsigned int id;
+		struct brcm_sata_port *port;
+
+		if (of_property_read_u32(child, "reg", &id)) {
+			dev_err(dev, "missing reg property in node %s\n",
+					child->name);
+			return -EINVAL;
+		}
+
+		if (id >= MAX_PORTS) {
+			dev_err(dev, "invalid reg: %u\n", id);
+			return -EINVAL;
+		}
+		if (priv->phys[id].phy) {
+			dev_err(dev, "already registered port %u\n", id);
+			return -EINVAL;
+		}
+
+		port = &priv->phys[id];
+		port->portnum = id;
+		port->phy_priv = priv;
+		port->phy = devm_phy_create(dev, child, &phy_ops_28nm);
+		port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc");
+		if (IS_ERR(port->phy)) {
+			dev_err(dev, "failed to create PHY\n");
+			return PTR_ERR(port->phy);
+		}
+
+		phy_set_drvdata(port->phy, port);
+		count++;
+	}
+
+	provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
Quoted 8 lines

drivers/phy/phy-brcmstb-sata.c line 198

Quoted 6 lines
drivers/phy/phy-brcmstb-sata.c new file +6 -0
+	if (IS_ERR(provider)) {
+		dev_err(dev, "could not register PHY provider\n");
+		return PTR_ERR(provider);
+	}
+
+	dev_info(dev, "registered %d port(s)\n", count);

lets not make the boot noisy. Change to dev_dbg?

Why? What's the harm? And I thought we discussed this already. "Noisy" depends on your point of view; IMO, this is important information. If for some reason this driver wasn't loaded or probed, we'd want to know. Besides, dev_dbg() requires you to fiddle with both the log level and the dynamic debug boot parameters just to get these informational messages.

Brian

#13 lore raw

Re: [PATCH v3 4/5] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs

Hi,

Quoted 110 lines · Brian Norris
Quoted 100 lines · Kishon Vijay Abraham I

Hi,

Quoted 4 lines · Brian Norris

Supports up to two ports which can each be powered on/off and configured independently.

couple of minor comments below

Quoted 91 lines

---
v3: no change

v2:
- stop sharing SATA_TOP_CTRL registers with SATA driver
- kill custom xlate function

  drivers/phy/Kconfig            |   9 ++
  drivers/phy/Makefile           |   1 +
  drivers/phy/phy-brcmstb-sata.c | 216 +++++++++++++++++++++++++++++++++++++++++
  3 files changed, 226 insertions(+)

create mode 100644 drivers/phy/phy-brcmstb-sata.c

drivers/phy/Kconfig +9 -0
index a53bd5b52df9..36788b6f0220 100644
@@ -309,4 +309,13 @@ config PHY_QCOM_UFS
  	help
  	  Support for UFS PHY on QCOM chipsets.
 
+config PHY_BRCMSTB_SATA
+	tristate "Broadcom STB SATA PHY driver"
+	depends on ARCH_BRCMSTB
+	depends on OF
+	select GENERIC_PHY
+	help
+	  Enable this to support the SATA3 PHY on 28nm Broadcom STB SoCs.
+	  Likely useful only with CONFIG_SATA_BRCMSTB enabled.
+
  endmenu
drivers/phy/Makefile +1 -0
index f12625178780..c61f3fdd191e 100644
@@ -40,3 +40,4 @@ obj-$(CONFIG_PHY_STIH41X_USB)		+= phy-stih41x-usb.o
  obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs.o
  obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-20nm.o
  obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-14nm.o
+obj-$(CONFIG_PHY_BRCMSTB_SATA)		+= phy-brcmstb-sata.o
drivers/phy/phy-brcmstb-sata.c new file +45 -0
new file mode 100644
index 000000000000..8387c8cbea8c
@@ -0,0 +1,216 @@
+/*
+ * Broadcom SATA3 AHCI Controller PHY Driver
+ *
+ * Copyright ? 2009-2015 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+
+#define SATA_MDIO_BANK_OFFSET				0x23c
+#define SATA_MDIO_REG_OFFSET(ofs)			((ofs) * 4)
+#define SATA_MDIO_REG_SPACE_SIZE			0x1000
+#define SATA_MDIO_REG_LENGTH				0x1f00
+
+#define MAX_PORTS					2
+
+/* Register offset between PHYs in PCB space */
+#define SATA_MDIO_REG_SPACE_SIZE			0x1000
+
+struct brcm_sata_port {
+	int portnum;
+	struct phy *phy;
+	struct brcm_sata_phy *phy_priv;
+	bool ssc_en;
+};
+
+struct brcm_sata_phy {
+	struct device *dev;
Quoted 8 lines

drivers/phy/phy-brcmstb-sata.c line 51

Quoted 6 lines
drivers/phy/phy-brcmstb-sata.c new file +6 -0
+	void __iomem *phy_base;
+
+	struct brcm_sata_port phys[MAX_PORTS];
+};
+
+enum sata_mdio_phy_regs_28nm {

Why should these defines be in enum?

Quoted 2 lines

Why not? They're logically grouped this way, and IMO, they look nicer. You can see drivers/ata/ahci.h for a similar example.

fair enough.

Quoted 156 lines
Quoted 33 lines
Quoted 33 lines
drivers/phy/phy-brcmstb-sata.c new file +32 -0
+	PLL_REG_BANK_0				= 0x50,
+	PLL_REG_BANK_0_PLLCONTROL_0		= 0x81,
+
+	TXPMD_REG_BANK				= 0x1a0,
+	TXPMD_CONTROL1				= 0x81,
+	TXPMD_CONTROL1_TX_SSC_EN_FRC		= BIT(0),
+	TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL	= BIT(1),
+	TXPMD_TX_FREQ_CTRL_CONTROL1		= 0x82,
+	TXPMD_TX_FREQ_CTRL_CONTROL2		= 0x83,
+	TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK	= 0x3ff,
+	TXPMD_TX_FREQ_CTRL_CONTROL3		= 0x84,
+	TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK	= 0x3ff,
+};
+
+static inline void __iomem *brcm_sata_phy_base(struct brcm_sata_port *port)
+{
+	struct brcm_sata_phy *priv = port->phy_priv;
+
+	return priv->phy_base + (port->portnum * SATA_MDIO_REG_SPACE_SIZE);
+}
+
+static void brcm_sata_mdio_wr(void __iomem *addr, u32 bank, u32 ofs,
+			      u32 msk, u32 value)
+{
+	u32 tmp;
+
+	writel(bank, addr + SATA_MDIO_BANK_OFFSET);
+	tmp = readl(addr + SATA_MDIO_REG_OFFSET(ofs));
+	tmp = (tmp & msk) | value;
+	writel(tmp, addr + SATA_MDIO_REG_OFFSET(ofs));
+}
+
Quoted 8 lines

drivers/phy/phy-brcmstb-sata.c line 89

Quoted 6 lines
drivers/phy/phy-brcmstb-sata.c new file +6 -0
+/* These defaults were characterized by H/W group */
+#define FMIN_VAL_DEFAULT	0x3df
+#define FMAX_VAL_DEFAULT	0x3df
+#define FMAX_VAL_SSC		0x83
+
+static void cfg_ssc_28nm(struct brcm_sata_port *port)

brcm_sata_cfg_ssc_28nm to make it similar to other functions.

OK.

Quoted 103 lines
Quoted 103 lines
drivers/phy/phy-brcmstb-sata.c new file +103 -0
+{
+	void __iomem *base = brcm_sata_phy_base(port);
+	struct brcm_sata_phy *priv = port->phy_priv;
+	u32 tmp;
+
+	/* override the TX spread spectrum setting */
+	tmp = TXPMD_CONTROL1_TX_SSC_EN_FRC_VAL | TXPMD_CONTROL1_TX_SSC_EN_FRC;
+	brcm_sata_mdio_wr(base, TXPMD_REG_BANK, TXPMD_CONTROL1, ~tmp, tmp);
+
+	/* set fixed min freq */
+	brcm_sata_mdio_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL2,
+			  ~TXPMD_TX_FREQ_CTRL_CONTROL2_FMIN_MASK,
+			  FMIN_VAL_DEFAULT);
+
+	/* set fixed max freq depending on SSC config */
+	if (port->ssc_en) {
+		dev_info(priv->dev, "enabling SSC on port %d\n", port->portnum);
+		tmp = FMAX_VAL_SSC;
+	} else {
+		tmp = FMAX_VAL_DEFAULT;
+	}
+
+	brcm_sata_mdio_wr(base, TXPMD_REG_BANK, TXPMD_TX_FREQ_CTRL_CONTROL3,
+			  ~TXPMD_TX_FREQ_CTRL_CONTROL3_FMAX_MASK, tmp);
+}
+
+static int brcm_sata_phy_init(struct phy *phy)
+{
+	struct brcm_sata_port *port = phy_get_drvdata(phy);
+
+	cfg_ssc_28nm(port);
+
+	return 0;
+}
+
+static struct phy_ops phy_ops_28nm = {
+	.init		= brcm_sata_phy_init,
+	.owner		= THIS_MODULE,
+};
+
+static const struct of_device_id brcm_sata_phy_of_match[] = {
+	{ .compatible	= "brcm,bcm7445-sata-phy" },
+	{},
+};
+MODULE_DEVICE_TABLE(of, brcm_sata_phy_of_match);
+
+static int brcm_sata_phy_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device_node *dn = dev->of_node, *child;
+	struct brcm_sata_phy *priv;
+	struct resource *res;
+	struct phy_provider *provider;
+	int count = 0;
+
+	if (of_get_child_count(dn) == 0)
+		return -ENODEV;
+
+	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+	dev_set_drvdata(dev, priv);
+	priv->dev = dev;
+
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy");
+	priv->phy_base = devm_ioremap_resource(dev, res);
+	if (IS_ERR(priv->phy_base))
+		return PTR_ERR(priv->phy_base);
+
+	for_each_available_child_of_node(dn, child) {
+		unsigned int id;
+		struct brcm_sata_port *port;
+
+		if (of_property_read_u32(child, "reg", &id)) {
+			dev_err(dev, "missing reg property in node %s\n",
+					child->name);
+			return -EINVAL;
+		}
+
+		if (id >= MAX_PORTS) {
+			dev_err(dev, "invalid reg: %u\n", id);
+			return -EINVAL;
+		}
+		if (priv->phys[id].phy) {
+			dev_err(dev, "already registered port %u\n", id);
+			return -EINVAL;
+		}
+
+		port = &priv->phys[id];
+		port->portnum = id;
+		port->phy_priv = priv;
+		port->phy = devm_phy_create(dev, child, &phy_ops_28nm);
+		port->ssc_en = of_property_read_bool(child, "brcm,enable-ssc");
+		if (IS_ERR(port->phy)) {
+			dev_err(dev, "failed to create PHY\n");
+			return PTR_ERR(port->phy);
+		}
+
+		phy_set_drvdata(port->phy, port);
+		count++;
+	}
+
+	provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
Quoted 8 lines

drivers/phy/phy-brcmstb-sata.c line 198

Quoted 6 lines
drivers/phy/phy-brcmstb-sata.c new file +6 -0
+	if (IS_ERR(provider)) {
+		dev_err(dev, "could not register PHY provider\n");
+		return PTR_ERR(provider);
+	}
+
+	dev_info(dev, "registered %d port(s)\n", count);

lets not make the boot noisy. Change to dev_dbg?

Quoted 6 lines

Why? What's the harm? And I thought we discussed this already. "Noisy" depends on your point of view; IMO, this is important information. If for some reason this driver wasn't loaded or probed, we'd want to know. Besides, dev_dbg() requires you to fiddle with both the log level and the dynamic debug boot parameters just to get these informational messages.

so be it. While sending the next version please also add a MAINTAINERs entry for this driver.

Cheers
Kishon

#14 lore raw

Re: [PATCH v3 4/5] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs

Quoted 2 lines · Kishon Vijay Abraham I

While sending the next version please also add a
MAINTAINERs entry for this driver.

I think this has it covered, right?

https://lkml.org/lkml/2015/3/18/932

Brian

#15 lore raw

Re: [PATCH v3 4/5] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs

Quoted 7 lines · Brian Norris
Quoted 2 lines · Kishon Vijay Abraham I

While sending the next version please also add a
MAINTAINERs entry for this driver.

I think this has it covered, right?

https://lkml.org/lkml/2015/3/18/932

Kishon, this patch is on its way to arm-soc via a pull request:
http://www.spinics.net/lists/arm-kernel/msg418276.html

this should address your concern. Thanks!

Signature · 1 line
Florian
#16 lore raw

Re: [PATCH v3 4/5] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs

Quoted 5 lines · Florian Fainelli
Quoted 4 lines · Brian Norris
Quoted 2 lines · Kishon Vijay Abraham I

While sending the next version please also add a
MAINTAINERs entry for this driver.

Quoted 8 lines
Quoted 3 lines

I think this has it covered, right?

https://lkml.org/lkml/2015/3/18/932

Kishon, this patch is on its way to arm-soc via a pull request:
http://www.spinics.net/lists/arm-kernel/msg418276.html

this should address your concern. Thanks!

Indeed!

Thanks
Kishon

#17 lore raw

PATCH v4 1/1 phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs

In reply to Brian Norris

Supports up to two ports which can each be powered on/off and configured independently.

---
Note this was part of a 5-patch series (this patch is 'In-Reply-To' version 3 of the series). Because there were no comments on the other patches, and this driver only had a trivial modification, I'm sending just this single driver. Please consider merging v3 of all the other patches.

v4:
- rename cfg_ssc_28nm() to brcm_sata_cfg_ssc_28nm()
- MAINTAINERS entry is queued up in arm-soc (regex for brcmstb)

v3: no change

v2:
- stop sharing SATA_TOP_CTRL registers with SATA driver
- kill custom xlate function

 drivers/phy/Kconfig            |   9 ++
 drivers/phy/Makefile           |   1 +
 drivers/phy/phy-brcmstb-sata.c | 216 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 226 insertions(+)
 create mode 100644 drivers/phy/phy-brcmstb-sata.c
drivers/phy/Kconfig +9 -0
index a53bd5b52df9..36788b6f0220 100644
@@ -309,4 +309,13 @@ config PHY_QCOM_UFS
 	help
 	  Support for UFS PHY on QCOM chipsets.
 
+config PHY_BRCMSTB_SATA
+	tristate "Broadcom STB SATA PHY driver"
+	depends on ARCH_BRCMSTB
+	depends on OF
+	select GENERIC_PHY
+	help
+	  Enable this to support the SATA3 PHY on 28nm Broadcom STB SoCs.
+	  Likely useful only with CONFIG_SATA_BRCMSTB enabled.
+
 endmenu
drivers/phy/Makefile +1 -0
index f12625178780..c61f3fdd191e 100644
@@ -40,3 +40,4 @@ obj-$(CONFIG_PHY_STIH41X_USB)		+= phy-stih41x-usb.o
 obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs.o
 obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-20nm.o
 obj-$(CONFIG_PHY_QCOM_UFS) 	+= phy-qcom-ufs-qmp-14nm.o
+obj-$(CONFIG_PHY_BRCMSTB_SATA)		+= phy-brcmstb-sata.o
drivers/phy/phy-brcmstb-sata.c new file +216 -0

216 lines not on this page · raw message

Signature · 1 line
1.9.1
#18 lore raw

PATCH v3 5/5 ARM: dts: brcmstb: add nodes for SATA controller and PHY

In reply to Brian Norris

---
v3: no change

v2:
- fix up some typos
- account for binding changes in previous patches

 arch/arm/boot/dts/bcm7445.dtsi | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)
arch/arm/boot/dts/bcm7445.dtsi +37 -0
index 39ac7840d7ee..ce44a211b05c 100644
@@ -108,6 +108,43 @@
 			brcm,int-map-mask = <0x25c>, <0x7000000>;
 			brcm,int-fwd-mask = <0x70000>;
 		};
+
+		sata at 45a000 {
+			compatible = "brcm,bcm7445-ahci", "brcm,sata3-ahci";
+			reg-names = "ahci", "top-ctrl";
+			reg = <0x45a000 0xa9c>, <0x458040 0x24>;
+			interrupts = <GIC_SPI 30 0>;
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			sata0: sata-port at 0 {
+				reg = <0>;
+				phys = <&sata_phy0>;
+			};
+
+			sata1: sata-port at 1 {
+				reg = <1>;
+				phys = <&sata_phy1>;
+			};
+		};
+
+		sata_phy: sata-phy at 458100 {
+			compatible = "brcm,bcm7445-sata-phy", "brcm,phy-sata3";
+			reg = <0x458100 0x1f00>;
+			reg-names = "phy";
+			#address-cells = <0x1>;
+			#size-cells = <0x0>;
+
+			sata_phy0: sata-phy at 0 {
+				reg = <0>;
+				#phy-cells = <0>;
+			};
+
+			sata_phy1: sata-phy at 1 {
+				reg = <1>;
+				#phy-cells = <0>;
+			};
+		};
 	};
 
 	smpboot {
Signature · 1 line
1.9.1
#20 lore raw
In reply to Brian Norris

Hi Tejun,

Quoted 12 lines · Brian Norris

Few changes since v2, and the changes are *only* to the SATA driver, not to any of the DT bindings or the PHY driver. I'm resending the whole series for completeness.

I'll list the changelog in each patch, but in summary:

v2 -> v3:
- straighten out endianness for big endian MIPS and ARM in AHCI driver
- rename sata_brcmstb.c to ahci_brcmstb.c
- bind ahci_brcmstb.c against the specific string, "brcm,bcm7445-ahci" instead of the generic one

Quoted 8 lines

Brian

Brian Norris (5):
Documentation: devicetree: add Broadcom SATA binding
Documentation: devicetree: add Broadcom SATA PHY binding
ata: add Broadcom AHCI SATA3 driver for STB chips
phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs
ARM: dts: brcmstb: add nodes for SATA controller and PHY

I'll pick "[PATCH v3 2/5] Documentation: devicetree: add Broadcom SATA PHY binding" and
"[PATCH v4] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs" in the linux-phy tree.

Thanks
Kishon

#21 lore raw

Hello,

Quoted 4 lines · Kishon Vijay Abraham I

I'll pick "[PATCH v3 2/5] Documentation: devicetree: add Broadcom SATA PHY binding" and
"[PATCH v4] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs" in the linux-phy tree.

Applying patch 5 to libata/for-4.2. If more need to go through libata, please let me know.

Thanks.

Signature · 1 line
tejun
#22 lore raw
Quoted 10 lines · Tejun Heo

Hello,

Quoted 4 lines · Kishon Vijay Abraham I

I'll pick "[PATCH v3 2/5] Documentation: devicetree: add Broadcom SATA PHY binding" and
"[PATCH v4] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs" in the linux-phy tree.

Applying patch 5 to libata/for-4.2. If more need to go through libata, please let me know.

lol not patch 5, the following one. Sorry.

[PATCH v3 3/5] ata: add Broadcom AHCI SATA3 driver for STB chips

Signature · 1 line
tejun
#23 lore raw
Quoted 4 lines · Tejun Heo
Quoted 3 lines · Tejun Heo
Quoted 2 lines · Kishon Vijay Abraham I

I'll pick "[PATCH v3 2/5] Documentation: devicetree: add Broadcom SATA PHY binding" and

Thanks Kishon!

Quoted 9 lines
Quoted 5 lines
Quoted 2 lines

"[PATCH v4] phy: add Broadcom SATA3 PHY driver for Broadcom STB SoCs" in the linux-phy tree.

Applying patch 5 to libata/for-4.2. If more need to go through libata, please let me know.

lol not patch 5, the following one. Sorry.

[PATCH v3 3/5] ata: add Broadcom AHCI SATA3 driver for STB chips

Thanks. Also, this one?

[PATCH v3 1/5] Documentation: devicetree: add Broadcom SATA binding

Regards,
Brian

#24 lore raw
Quoted 5 lines · Brian Norris
Quoted 1 line

[PATCH v3 3/5] ata: add Broadcom AHCI SATA3 driver for STB chips

Thanks. Also, this one?

[PATCH v3 1/5] Documentation: devicetree: add Broadcom SATA binding

devicetree patches usually haven't gone through libata tho. Is this an exception?

Thanks.

Signature · 1 line
tejun
#25 lore raw
Quoted 8 lines · Tejun Heo
Quoted 5 lines · Brian Norris
Quoted 1 line

[PATCH v3 3/5] ata: add Broadcom AHCI SATA3 driver for STB chips

Thanks. Also, this one?

[PATCH v3 1/5] Documentation: devicetree: add Broadcom SATA binding

devicetree patches usually haven't gone through libata tho.

Most subsystems take device tree binding patches for their constituent drivers. And I see you've been merging others:

e35b98849f25 ata: sata_rcar: Add r8a7793 device support 8340bfeb03 ahci: st: Update the ahci_st DT documentation af64dce4cb3a ahci: st: Provide DT bindings for ST's SATA implementation a1a205df6ee2 ahci: add support for Hisilicon sata

All have your sign-off / commit stamp.

Quoted 2 lines

Is this
an exception?

Not that I know of. Where would you like it to go instead?

Brian

#26 lore raw

Hello,

Quoted 9 lines · Brian Norris

Most subsystems take device tree binding patches for their constituent drivers. And I see you've been merging others:

e35b98849f25 ata: sata_rcar: Add r8a7793 device support 8340bfeb03 ahci: st: Update the ahci_st DT documentation af64dce4cb3a ahci: st: Provide DT bindings for ST's SATA implementation a1a205df6ee2 ahci: add support for Hisilicon sata

All have your sign-off / commit stamp.

Yeap, I've been routing some of them.

Quoted 4 lines
Quoted 2 lines

Is this
an exception?

Not that I know of. Where would you like it to go instead?

But the rules have never been clear to me. If the subsystem maintainer is okay with it, I'm happy to take the patches. I'm just kinda curious why this doesn't go through devicetree tree while some other devicetree patches go through there. Can somebody explain the overall policy to me? I'm not looking for some absolute rules and exceptions are fine but I do wanna have a general direction.

Thanks.

Signature · 1 line
tejun
#27 lore raw

I can explain part of this, but I'm curious if anyone else has different info.

Quoted 4 lines · Tejun Heo

But the rules have never been clear to me. If the subsystem maintainer is okay with it, I'm happy to take the patches. I'm just kinda curious why this doesn't go through devicetree tree while some other devicetree patches go through there.

AFAIK, there is no official tree for device tree bindings. There's just a mailing list and several reviewers, who usually try to help on the big picture binding review. Note that there's no tree listed in MAINTAINERS under:

OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS

But you will see several MAINTAINERS entries for different subdirs of Documentation/devicetree/bindings/. Maybe you should add one for .../ata if you're going to continue taking patches?

It's possible you're confusing binding documentation with .dts source files? The DTS files (arch/*/boot/dts/) go through arch trees. For instance, the arm-soc maintainers have a structured process by which sub-architecture maintainers track .dts(i) file updates for their boards/chips and filter them up to Arnd, Olof, etc., via their separate 'dts' branches. That's why Florian took patch 5 to his tree.

Quoted 3 lines

Can somebody explain the
overall policy to me? I'm not looking for some absolute rules and exceptions are fine but I do wanna have a general direction.

Brian

#28 lore raw

Hello, Brian.

Quoted 6 lines · Brian Norris

It's possible you're confusing binding documentation with .dts source files? The DTS files (arch/*/boot/dts/) go through arch trees. For instance, the arm-soc maintainers have a structured process by which sub-architecture maintainers track .dts(i) file updates for their boards/chips and filter them up to Arnd, Olof, etc., via their separate 'dts' branches. That's why Florian took patch 5 to his tree.

Yeah, I think that's why I'm constantly getting confused, so the binding documentation and actual libata changes through libata and the rest through arch trees. Got it.

Thanks for the explanation.

Signature · 1 line
tejun