Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 373c78e1 authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville
Browse files

brcm80211: smac: use bcma core access functions in otp.c



The code in otp.c now uses the bcma core access functions to
read the OTP information from the device.

Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: default avatarAlwin Beukers <alwin@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarFranky Lin <frankyl@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent d3126c52
Loading
Loading
Loading
Loading
+26 −42
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ struct otp_fn_s {
};

struct otpinfo {
	uint ccrev;		/* chipc revision */
	struct bcma_device *core; /* chipc core */
	const struct otp_fn_s *fn;	/* OTP functions */
	struct si_pub *sih;		/* Saved sb handle */

@@ -133,9 +133,10 @@ struct otpinfo {
#define OTP_SZ_FU_144		(144/8)	/* 144 bits */

static u16
ipxotp_otpr(struct otpinfo *oi, struct chipcregs __iomem *cc, uint wn)
ipxotp_otpr(struct otpinfo *oi, uint wn)
{
	return R_REG(&cc->sromotp[wn]);
	return bcma_read16(oi->core,
			   CHIPCREGOFFS(sromotp[wn]));
}

/*
@@ -161,19 +162,21 @@ static int ipxotp_max_rgnsz(struct si_pub *sih, int osizew)
	return ret;
}

static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
static void _ipxotp_init(struct otpinfo *oi)
{
	uint k;
	u32 otpp, st;
	int ccrev = ai_get_ccrev(oi->sih);


	/*
	 * record word offset of General Use Region
	 * for various chipcommon revs
	 */
	if (oi->ccrev == 21 || oi->ccrev == 24
	    || oi->ccrev == 27) {
	if (ccrev == 21 || ccrev == 24
	    || ccrev == 27) {
		oi->otpgu_base = REVA4_OTPGU_BASE;
	} else if (oi->ccrev == 36) {
	} else if (ccrev == 36) {
		/*
		 * OTP size greater than equal to 2KB (128 words),
		 * otpgu_base is similar to rev23
@@ -182,7 +185,7 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
			oi->otpgu_base = REVB8_OTPGU_BASE;
		else
			oi->otpgu_base = REV36_OTPGU_BASE;
	} else if (oi->ccrev == 23 || oi->ccrev >= 25) {
	} else if (ccrev == 23 || ccrev >= 25) {
		oi->otpgu_base = REVB8_OTPGU_BASE;
	}

@@ -190,24 +193,21 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
	otpp =
	    OTPP_START_BUSY | ((OTPPOC_INIT << OTPP_OC_SHIFT) & OTPP_OC_MASK);

	W_REG(&cc->otpprog, otpp);
	for (k = 0;
	     ((st = R_REG(&cc->otpprog)) & OTPP_START_BUSY)
	     && (k < OTPP_TRIES); k++)
		;
	bcma_write32(oi->core, CHIPCREGOFFS(otpprog), otpp);
	st = bcma_read32(oi->core, CHIPCREGOFFS(otpprog));
	for (k = 0; (st & OTPP_START_BUSY) && (k < OTPP_TRIES); k++)
		st = bcma_read32(oi->core, CHIPCREGOFFS(otpprog));
	if (k >= OTPP_TRIES)
		return;

	/* Read OTP lock bits and subregion programmed indication bits */
	oi->status = R_REG(&cc->otpstatus);
	oi->status = bcma_read32(oi->core, CHIPCREGOFFS(otpstatus));

	if ((ai_get_chip_id(oi->sih) == BCM43224_CHIP_ID)
	    || (ai_get_chip_id(oi->sih) == BCM43225_CHIP_ID)) {
		u32 p_bits;
		p_bits =
		    (ipxotp_otpr(oi, cc, oi->otpgu_base + OTPGU_P_OFF) &
		     OTPGU_P_MSK)
		    >> OTPGU_P_SHIFT;
		p_bits = (ipxotp_otpr(oi, oi->otpgu_base + OTPGU_P_OFF) &
			  OTPGU_P_MSK) >> OTPGU_P_SHIFT;
		oi->status |= (p_bits << OTPS_GUP_SHIFT);
	}

@@ -220,7 +220,7 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
	oi->hwlim = oi->wsize;
	if (oi->status & OTPS_GUP_HW) {
		oi->hwlim =
		    ipxotp_otpr(oi, cc, oi->otpgu_base + OTPGU_HSB_OFF) / 16;
		    ipxotp_otpr(oi, oi->otpgu_base + OTPGU_HSB_OFF) / 16;
		oi->swbase = oi->hwlim;
	} else
		oi->swbase = oi->hwbase;
@@ -230,7 +230,7 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)

	if (oi->status & OTPS_GUP_SW) {
		oi->swlim =
		    ipxotp_otpr(oi, cc, oi->otpgu_base + OTPGU_SFB_OFF) / 16;
		    ipxotp_otpr(oi, oi->otpgu_base + OTPGU_SFB_OFF) / 16;
		oi->fbase = oi->swlim;
	} else
		oi->fbase = oi->swbase;
@@ -240,11 +240,8 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)

static int ipxotp_init(struct si_pub *sih, struct otpinfo *oi)
{
	uint idx;
	struct chipcregs __iomem *cc;

	/* Make sure we're running IPX OTP */
	if (!OTPTYPE_IPX(oi->ccrev))
	if (!OTPTYPE_IPX(ai_get_ccrev(sih)))
		return -EBADE;

	/* Make sure OTP is not disabled */
@@ -282,21 +279,13 @@ static int ipxotp_init(struct si_pub *sih, struct otpinfo *oi)
	}

	/* Retrieve OTP region info */
	idx = ai_coreidx(sih);
	cc = ai_setcoreidx(sih, SI_CC_IDX);

	_ipxotp_init(oi, cc);

	ai_setcoreidx(sih, idx);

	_ipxotp_init(oi);
	return 0;
}

static int
ipxotp_read_region(struct otpinfo *oi, int region, u16 *data, uint *wlen)
{
	uint idx;
	struct chipcregs __iomem *cc;
	uint base, i, sz;

	/* Validate region selection */
@@ -365,14 +354,10 @@ ipxotp_read_region(struct otpinfo *oi, int region, u16 *data, uint *wlen)
		return -EINVAL;
	}

	idx = ai_coreidx(oi->sih);
	cc = ai_setcoreidx(oi->sih, SI_CC_IDX);

	/* Read the data */
	for (i = 0; i < sz; i++)
		data[i] = ipxotp_otpr(oi, cc, base + i);
		data[i] = ipxotp_otpr(oi, base + i);

	ai_setcoreidx(oi->sih, idx);
	*wlen = sz;
	return 0;
}
@@ -384,14 +369,13 @@ static const struct otp_fn_s ipxotp_fn = {

static int otp_init(struct si_pub *sih, struct otpinfo *oi)
{

	int ret;

	memset(oi, 0, sizeof(struct otpinfo));

	oi->ccrev = ai_get_ccrev(sih);
	oi->core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);

	if (OTPTYPE_IPX(oi->ccrev))
	if (OTPTYPE_IPX(ai_get_ccrev(sih)))
		oi->fn = &ipxotp_fn;

	if (oi->fn == NULL)
+2 −0
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@

#include "defs.h"		/* for PAD macro */

#define CHIPCREGOFFS(field)	offsetof(struct chipcregs, field)

struct chipcregs {
	u32 chipid;		/* 0x0 */
	u32 capabilities;